/*
 * Copyright (c) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
"use strict";
// Object.defineProperty(exports, "__esModule", { value: !0 });
var commonjsGlobal =
  "undefined" != typeof window
    ? window
    : "undefined" != typeof global
    ? global
    : "undefined" != typeof self
    ? self
    : {};
function createCommonjsModule(e, r) {
  return e((r = { exports: {} }), r.exports), r.exports;
}
var he = createCommonjsModule(function (e, r) {
    !(function (t) {
      var a = r,
        n = e && e.exports == a && e,
        o = "object" == typeof commonjsGlobal && commonjsGlobal;
      (o.global !== o && o.window !== o) || (t = o);
      var s = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
        i = /[\x01-\x7F]/g,
        l = /[\x01-\t\x0B\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g,
        u =
          /<\u20D2|=\u20E5|>\u20D2|\u205F\u200A|\u219D\u0338|\u2202\u0338|\u2220\u20D2|\u2229\uFE00|\u222A\uFE00|\u223C\u20D2|\u223D\u0331|\u223E\u0333|\u2242\u0338|\u224B\u0338|\u224D\u20D2|\u224E\u0338|\u224F\u0338|\u2250\u0338|\u2261\u20E5|\u2264\u20D2|\u2265\u20D2|\u2266\u0338|\u2267\u0338|\u2268\uFE00|\u2269\uFE00|\u226A\u0338|\u226A\u20D2|\u226B\u0338|\u226B\u20D2|\u227F\u0338|\u2282\u20D2|\u2283\u20D2|\u228A\uFE00|\u228B\uFE00|\u228F\u0338|\u2290\u0338|\u2293\uFE00|\u2294\uFE00|\u22B4\u20D2|\u22B5\u20D2|\u22D8\u0338|\u22D9\u0338|\u22DA\uFE00|\u22DB\uFE00|\u22F5\u0338|\u22F9\u0338|\u2933\u0338|\u29CF\u0338|\u29D0\u0338|\u2A6D\u0338|\u2A70\u0338|\u2A7D\u0338|\u2A7E\u0338|\u2AA1\u0338|\u2AA2\u0338|\u2AAC\uFE00|\u2AAD\uFE00|\u2AAF\u0338|\u2AB0\u0338|\u2AC5\u0338|\u2AC6\u0338|\u2ACB\uFE00|\u2ACC\uFE00|\u2AFD\u20E5|[\xA0-\u0113\u0116-\u0122\u0124-\u012B\u012E-\u014D\u0150-\u017E\u0192\u01B5\u01F5\u0237\u02C6\u02C7\u02D8-\u02DD\u0311\u0391-\u03A1\u03A3-\u03A9\u03B1-\u03C9\u03D1\u03D2\u03D5\u03D6\u03DC\u03DD\u03F0\u03F1\u03F5\u03F6\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E\u045F\u2002-\u2005\u2007-\u2010\u2013-\u2016\u2018-\u201A\u201C-\u201E\u2020-\u2022\u2025\u2026\u2030-\u2035\u2039\u203A\u203E\u2041\u2043\u2044\u204F\u2057\u205F-\u2063\u20AC\u20DB\u20DC\u2102\u2105\u210A-\u2113\u2115-\u211E\u2122\u2124\u2127-\u2129\u212C\u212D\u212F-\u2131\u2133-\u2138\u2145-\u2148\u2153-\u215E\u2190-\u219B\u219D-\u21A7\u21A9-\u21AE\u21B0-\u21B3\u21B5-\u21B7\u21BA-\u21DB\u21DD\u21E4\u21E5\u21F5\u21FD-\u2205\u2207-\u2209\u220B\u220C\u220F-\u2214\u2216-\u2218\u221A\u221D-\u2238\u223A-\u2257\u2259\u225A\u225C\u225F-\u2262\u2264-\u228B\u228D-\u229B\u229D-\u22A5\u22A7-\u22B0\u22B2-\u22BB\u22BD-\u22DB\u22DE-\u22E3\u22E6-\u22F7\u22F9-\u22FE\u2305\u2306\u2308-\u2310\u2312\u2313\u2315\u2316\u231C-\u231F\u2322\u2323\u232D\u232E\u2336\u233D\u233F\u237C\u23B0\u23B1\u23B4-\u23B6\u23DC-\u23DF\u23E2\u23E7\u2423\u24C8\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2550-\u256C\u2580\u2584\u2588\u2591-\u2593\u25A1\u25AA\u25AB\u25AD\u25AE\u25B1\u25B3-\u25B5\u25B8\u25B9\u25BD-\u25BF\u25C2\u25C3\u25CA\u25CB\u25EC\u25EF\u25F8-\u25FC\u2605\u2606\u260E\u2640\u2642\u2660\u2663\u2665\u2666\u266A\u266D-\u266F\u2713\u2717\u2720\u2736\u2758\u2772\u2773\u27C8\u27C9\u27E6-\u27ED\u27F5-\u27FA\u27FC\u27FF\u2902-\u2905\u290C-\u2913\u2916\u2919-\u2920\u2923-\u292A\u2933\u2935-\u2939\u293C\u293D\u2945\u2948-\u294B\u294E-\u2976\u2978\u2979\u297B-\u297F\u2985\u2986\u298B-\u2996\u299A\u299C\u299D\u29A4-\u29B7\u29B9\u29BB\u29BC\u29BE-\u29C5\u29C9\u29CD-\u29D0\u29DC-\u29DE\u29E3-\u29E5\u29EB\u29F4\u29F6\u2A00-\u2A02\u2A04\u2A06\u2A0C\u2A0D\u2A10-\u2A17\u2A22-\u2A27\u2A29\u2A2A\u2A2D-\u2A31\u2A33-\u2A3C\u2A3F\u2A40\u2A42-\u2A4D\u2A50\u2A53-\u2A58\u2A5A-\u2A5D\u2A5F\u2A66\u2A6A\u2A6D-\u2A75\u2A77-\u2A9A\u2A9D-\u2AA2\u2AA4-\u2AB0\u2AB3-\u2AC8\u2ACB\u2ACC\u2ACF-\u2ADB\u2AE4\u2AE6-\u2AE9\u2AEB-\u2AF3\u2AFD\uFB00-\uFB04]|\uD835[\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDD6B]/g,
        c = {
          "­": "shy",
          "‌": "zwnj",
          "‍": "zwj",
          "‎": "lrm",
          "⁣": "ic",
          "⁢": "it",
          "⁡": "af",
          "‏": "rlm",
          "​": "ZeroWidthSpace",
          "⁠": "NoBreak",
          "̑": "DownBreve",
          "⃛": "tdot",
          "⃜": "DotDot",
          "\t": "Tab",
          "\n": "NewLine",
          " ": "puncsp",
          " ": "MediumSpace",
          " ": "thinsp",
          " ": "hairsp",
          " ": "emsp13",
          " ": "ensp",
          " ": "emsp14",
          " ": "emsp",
          " ": "numsp",
          " ": "nbsp",
          "  ": "ThickSpace",
          "‾": "oline",
          _: "lowbar",
          "‐": "dash",
          "–": "ndash",
          "—": "mdash",
          "―": "horbar",
          ",": "comma",
          ";": "semi",
          "⁏": "bsemi",
          ":": "colon",
          "⩴": "Colone",
          "!": "excl",
          "¡": "iexcl",
          "?": "quest",
          "¿": "iquest",
          ".": "period",
          "‥": "nldr",
          "…": "mldr",
          "·": "middot",
          "'": "apos",
          "‘": "lsquo",
          "’": "rsquo",
          "‚": "sbquo",
          "‹": "lsaquo",
          "›": "rsaquo",
          '"': "quot",
          "“": "ldquo",
          "”": "rdquo",
          "„": "bdquo",
          "«": "laquo",
          "»": "raquo",
          "(": "lpar",
          ")": "rpar",
          "[": "lsqb",
          "]": "rsqb",
          "{": "lcub",
          "}": "rcub",
          "⌈": "lceil",
          "⌉": "rceil",
          "⌊": "lfloor",
          "⌋": "rfloor",
          "⦅": "lopar",
          "⦆": "ropar",
          "⦋": "lbrke",
          "⦌": "rbrke",
          "⦍": "lbrkslu",
          "⦎": "rbrksld",
          "⦏": "lbrksld",
          "⦐": "rbrkslu",
          "⦑": "langd",
          "⦒": "rangd",
          "⦓": "lparlt",
          "⦔": "rpargt",
          "⦕": "gtlPar",
          "⦖": "ltrPar",
          "⟦": "lobrk",
          "⟧": "robrk",
          "⟨": "lang",
          "⟩": "rang",
          "⟪": "Lang",
          "⟫": "Rang",
          "⟬": "loang",
          "⟭": "roang",
          "❲": "lbbrk",
          "❳": "rbbrk",
          "‖": "Vert",
          "§": "sect",
          "¶": "para",
          "@": "commat",
          "*": "ast",
          "/": "sol",
          undefined: null,
          "&": "amp",
          "#": "num",
          "%": "percnt",
          "‰": "permil",
          "‱": "pertenk",
          "†": "dagger",
          "‡": "Dagger",
          "•": "bull",
          "⁃": "hybull",
          "′": "prime",
          "″": "Prime",
          "‴": "tprime",
          "⁗": "qprime",
          "‵": "bprime",
          "⁁": "caret",
          "`": "grave",
          "´": "acute",
          "˜": "tilde",
          "^": "Hat",
          "¯": "macr",
          "˘": "breve",
          "˙": "dot",
          "¨": "die",
          "˚": "ring",
          "˝": "dblac",
          "¸": "cedil",
          "˛": "ogon",
          ˆ: "circ",
          ˇ: "caron",
          "°": "deg",
          "©": "copy",
          "®": "reg",
          "℗": "copysr",
          "℘": "wp",
          "℞": "rx",
          "℧": "mho",
          "℩": "iiota",
          "←": "larr",
          "↚": "nlarr",
          "→": "rarr",
          "↛": "nrarr",
          "↑": "uarr",
          "↓": "darr",
          "↔": "harr",
          "↮": "nharr",
          "↕": "varr",
          "↖": "nwarr",
          "↗": "nearr",
          "↘": "searr",
          "↙": "swarr",
          "↝": "rarrw",
          "↝̸": "nrarrw",
          "↞": "Larr",
          "↟": "Uarr",
          "↠": "Rarr",
          "↡": "Darr",
          "↢": "larrtl",
          "↣": "rarrtl",
          "↤": "mapstoleft",
          "↥": "mapstoup",
          "↦": "map",
          "↧": "mapstodown",
          "↩": "larrhk",
          "↪": "rarrhk",
          "↫": "larrlp",
          "↬": "rarrlp",
          "↭": "harrw",
          "↰": "lsh",
          "↱": "rsh",
          "↲": "ldsh",
          "↳": "rdsh",
          "↵": "crarr",
          "↶": "cularr",
          "↷": "curarr",
          "↺": "olarr",
          "↻": "orarr",
          "↼": "lharu",
          "↽": "lhard",
          "↾": "uharr",
          "↿": "uharl",
          "⇀": "rharu",
          "⇁": "rhard",
          "⇂": "dharr",
          "⇃": "dharl",
          "⇄": "rlarr",
          "⇅": "udarr",
          "⇆": "lrarr",
          "⇇": "llarr",
          "⇈": "uuarr",
          "⇉": "rrarr",
          "⇊": "ddarr",
          "⇋": "lrhar",
          "⇌": "rlhar",
          "⇐": "lArr",
          "⇍": "nlArr",
          "⇑": "uArr",
          "⇒": "rArr",
          "⇏": "nrArr",
          "⇓": "dArr",
          "⇔": "iff",
          "⇎": "nhArr",
          "⇕": "vArr",
          "⇖": "nwArr",
          "⇗": "neArr",
          "⇘": "seArr",
          "⇙": "swArr",
          "⇚": "lAarr",
          "⇛": "rAarr",
          "⇝": "zigrarr",
          "⇤": "larrb",
          "⇥": "rarrb",
          "⇵": "duarr",
          "⇽": "loarr",
          "⇾": "roarr",
          "⇿": "hoarr",
          "∀": "forall",
          "∁": "comp",
          "∂": "part",
          "∂̸": "npart",
          "∃": "exist",
          "∄": "nexist",
          "∅": "empty",
          "∇": "Del",
          "∈": "in",
          "∉": "notin",
          "∋": "ni",
          "∌": "notni",
          "϶": "bepsi",
          "∏": "prod",
          "∐": "coprod",
          "∑": "sum",
          "+": "plus",
          "±": "pm",
          "÷": "div",
          "×": "times",
          "<": "lt",
          "≮": "nlt",
          "<⃒": "nvlt",
          "=": "equals",
          "≠": "ne",
          "=⃥": "bne",
          "⩵": "Equal",
          ">": "gt",
          "≯": "ngt",
          ">⃒": "nvgt",
          "¬": "not",
          "|": "vert",
          "¦": "brvbar",
          "−": "minus",
          "∓": "mp",
          "∔": "plusdo",
          "⁄": "frasl",
          "∖": "setmn",
          "∗": "lowast",
          "∘": "compfn",
          "√": "Sqrt",
          "∝": "prop",
          "∞": "infin",
          "∟": "angrt",
          "∠": "ang",
          "∠⃒": "nang",
          "∡": "angmsd",
          "∢": "angsph",
          "∣": "mid",
          "∤": "nmid",
          "∥": "par",
          "∦": "npar",
          "∧": "and",
          "∨": "or",
          "∩": "cap",
          "∩︀": "caps",
          "∪": "cup",
          "∪︀": "cups",
          "∫": "int",
          "∬": "Int",
          "∭": "tint",
          "⨌": "qint",
          "∮": "oint",
          "∯": "Conint",
          "∰": "Cconint",
          "∱": "cwint",
          "∲": "cwconint",
          "∳": "awconint",
          "∴": "there4",
          "∵": "becaus",
          "∶": "ratio",
          "∷": "Colon",
          "∸": "minusd",
          "∺": "mDDot",
          "∻": "homtht",
          "∼": "sim",
          "≁": "nsim",
          "∼⃒": "nvsim",
          "∽": "bsim",
          "∽̱": "race",
          "∾": "ac",
          "∾̳": "acE",
          "∿": "acd",
          "≀": "wr",
          "≂": "esim",
          "≂̸": "nesim",
          "≃": "sime",
          "≄": "nsime",
          "≅": "cong",
          "≇": "ncong",
          "≆": "simne",
          "≈": "ap",
          "≉": "nap",
          "≊": "ape",
          "≋": "apid",
          "≋̸": "napid",
          "≌": "bcong",
          "≍": "CupCap",
          "≭": "NotCupCap",
          "≍⃒": "nvap",
          "≎": "bump",
          "≎̸": "nbump",
          "≏": "bumpe",
          "≏̸": "nbumpe",
          "≐": "doteq",
          "≐̸": "nedot",
          "≑": "eDot",
          "≒": "efDot",
          "≓": "erDot",
          "≔": "colone",
          "≕": "ecolon",
          "≖": "ecir",
          "≗": "cire",
          "≙": "wedgeq",
          "≚": "veeeq",
          "≜": "trie",
          "≟": "equest",
          "≡": "equiv",
          "≢": "nequiv",
          "≡⃥": "bnequiv",
          "≤": "le",
          "≰": "nle",
          "≤⃒": "nvle",
          "≥": "ge",
          "≱": "nge",
          "≥⃒": "nvge",
          "≦": "lE",
          "≦̸": "nlE",
          "≧": "gE",
          "≧̸": "ngE",
          "≨︀": "lvnE",
          "≨": "lnE",
          "≩": "gnE",
          "≩︀": "gvnE",
          "≪": "ll",
          "≪̸": "nLtv",
          "≪⃒": "nLt",
          "≫": "gg",
          "≫̸": "nGtv",
          "≫⃒": "nGt",
          "≬": "twixt",
          "≲": "lsim",
          "≴": "nlsim",
          "≳": "gsim",
          "≵": "ngsim",
          "≶": "lg",
          "≸": "ntlg",
          "≷": "gl",
          "≹": "ntgl",
          "≺": "pr",
          "⊀": "npr",
          "≻": "sc",
          "⊁": "nsc",
          "≼": "prcue",
          "⋠": "nprcue",
          "≽": "sccue",
          "⋡": "nsccue",
          "≾": "prsim",
          "≿": "scsim",
          "≿̸": "NotSucceedsTilde",
          "⊂": "sub",
          "⊄": "nsub",
          "⊂⃒": "vnsub",
          "⊃": "sup",
          "⊅": "nsup",
          "⊃⃒": "vnsup",
          "⊆": "sube",
          "⊈": "nsube",
          "⊇": "supe",
          "⊉": "nsupe",
          "⊊︀": "vsubne",
          "⊊": "subne",
          "⊋︀": "vsupne",
          "⊋": "supne",
          "⊍": "cupdot",
          "⊎": "uplus",
          "⊏": "sqsub",
          "⊏̸": "NotSquareSubset",
          "⊐": "sqsup",
          "⊐̸": "NotSquareSuperset",
          "⊑": "sqsube",
          "⋢": "nsqsube",
          "⊒": "sqsupe",
          "⋣": "nsqsupe",
          "⊓": "sqcap",
          "⊓︀": "sqcaps",
          "⊔": "sqcup",
          "⊔︀": "sqcups",
          "⊕": "oplus",
          "⊖": "ominus",
          "⊗": "otimes",
          "⊘": "osol",
          "⊙": "odot",
          "⊚": "ocir",
          "⊛": "oast",
          "⊝": "odash",
          "⊞": "plusb",
          "⊟": "minusb",
          "⊠": "timesb",
          "⊡": "sdotb",
          "⊢": "vdash",
          "⊬": "nvdash",
          "⊣": "dashv",
          "⊤": "top",
          "⊥": "bot",
          "⊧": "models",
          "⊨": "vDash",
          "⊭": "nvDash",
          "⊩": "Vdash",
          "⊮": "nVdash",
          "⊪": "Vvdash",
          "⊫": "VDash",
          "⊯": "nVDash",
          "⊰": "prurel",
          "⊲": "vltri",
          "⋪": "nltri",
          "⊳": "vrtri",
          "⋫": "nrtri",
          "⊴": "ltrie",
          "⋬": "nltrie",
          "⊴⃒": "nvltrie",
          "⊵": "rtrie",
          "⋭": "nrtrie",
          "⊵⃒": "nvrtrie",
          "⊶": "origof",
          "⊷": "imof",
          "⊸": "mumap",
          "⊹": "hercon",
          "⊺": "intcal",
          "⊻": "veebar",
          "⊽": "barvee",
          "⊾": "angrtvb",
          "⊿": "lrtri",
          "⋀": "Wedge",
          "⋁": "Vee",
          "⋂": "xcap",
          "⋃": "xcup",
          "⋄": "diam",
          "⋅": "sdot",
          "⋆": "Star",
          "⋇": "divonx",
          "⋈": "bowtie",
          "⋉": "ltimes",
          "⋊": "rtimes",
          "⋋": "lthree",
          "⋌": "rthree",
          "⋍": "bsime",
          "⋎": "cuvee",
          "⋏": "cuwed",
          "⋐": "Sub",
          "⋑": "Sup",
          "⋒": "Cap",
          "⋓": "Cup",
          "⋔": "fork",
          "⋕": "epar",
          "⋖": "ltdot",
          "⋗": "gtdot",
          "⋘": "Ll",
          "⋘̸": "nLl",
          "⋙": "Gg",
          "⋙̸": "nGg",
          "⋚︀": "lesg",
          "⋚": "leg",
          "⋛": "gel",
          "⋛︀": "gesl",
          "⋞": "cuepr",
          "⋟": "cuesc",
          "⋦": "lnsim",
          "⋧": "gnsim",
          "⋨": "prnsim",
          "⋩": "scnsim",
          "⋮": "vellip",
          "⋯": "ctdot",
          "⋰": "utdot",
          "⋱": "dtdot",
          "⋲": "disin",
          "⋳": "isinsv",
          "⋴": "isins",
          "⋵": "isindot",
          "⋵̸": "notindot",
          "⋶": "notinvc",
          "⋷": "notinvb",
          "⋹": "isinE",
          "⋹̸": "notinE",
          "⋺": "nisd",
          "⋻": "xnis",
          "⋼": "nis",
          "⋽": "notnivc",
          "⋾": "notnivb",
          "⌅": "barwed",
          "⌆": "Barwed",
          "⌌": "drcrop",
          "⌍": "dlcrop",
          "⌎": "urcrop",
          "⌏": "ulcrop",
          "⌐": "bnot",
          "⌒": "profline",
          "⌓": "profsurf",
          "⌕": "telrec",
          "⌖": "target",
          "⌜": "ulcorn",
          "⌝": "urcorn",
          "⌞": "dlcorn",
          "⌟": "drcorn",
          "⌢": "frown",
          "⌣": "smile",
          "⌭": "cylcty",
          "⌮": "profalar",
          "⌶": "topbot",
          "⌽": "ovbar",
          "⌿": "solbar",
          "⍼": "angzarr",
          "⎰": "lmoust",
          "⎱": "rmoust",
          "⎴": "tbrk",
          "⎵": "bbrk",
          "⎶": "bbrktbrk",
          "⏜": "OverParenthesis",
          "⏝": "UnderParenthesis",
          "⏞": "OverBrace",
          "⏟": "UnderBrace",
          "⏢": "trpezium",
          "⏧": "elinters",
          "␣": "blank",
          "─": "boxh",
          "│": "boxv",
          "┌": "boxdr",
          "┐": "boxdl",
          "└": "boxur",
          "┘": "boxul",
          "├": "boxvr",
          "┤": "boxvl",
          "┬": "boxhd",
          "┴": "boxhu",
          "┼": "boxvh",
          "═": "boxH",
          "║": "boxV",
          "╒": "boxdR",
          "╓": "boxDr",
          "╔": "boxDR",
          "╕": "boxdL",
          "╖": "boxDl",
          "╗": "boxDL",
          "╘": "boxuR",
          "╙": "boxUr",
          "╚": "boxUR",
          "╛": "boxuL",
          "╜": "boxUl",
          "╝": "boxUL",
          "╞": "boxvR",
          "╟": "boxVr",
          "╠": "boxVR",
          "╡": "boxvL",
          "╢": "boxVl",
          "╣": "boxVL",
          "╤": "boxHd",
          "╥": "boxhD",
          "╦": "boxHD",
          "╧": "boxHu",
          "╨": "boxhU",
          "╩": "boxHU",
          "╪": "boxvH",
          "╫": "boxVh",
          "╬": "boxVH",
          "▀": "uhblk",
          "▄": "lhblk",
          "█": "block",
          "░": "blk14",
          "▒": "blk12",
          "▓": "blk34",
          "□": "squ",
          "▪": "squf",
          "▫": "EmptyVerySmallSquare",
          "▭": "rect",
          "▮": "marker",
          "▱": "fltns",
          "△": "xutri",
          "▴": "utrif",
          "▵": "utri",
          "▸": "rtrif",
          "▹": "rtri",
          "▽": "xdtri",
          "▾": "dtrif",
          "▿": "dtri",
          "◂": "ltrif",
          "◃": "ltri",
          "◊": "loz",
          "○": "cir",
          "◬": "tridot",
          "◯": "xcirc",
          "◸": "ultri",
          "◹": "urtri",
          "◺": "lltri",
          "◻": "EmptySmallSquare",
          "◼": "FilledSmallSquare",
          "★": "starf",
          "☆": "star",
          "☎": "phone",
          "♀": "female",
          "♂": "male",
          "♠": "spades",
          "♣": "clubs",
          "♥": "hearts",
          "♦": "diams",
          "♪": "sung",
          "✓": "check",
          "✗": "cross",
          "✠": "malt",
          "✶": "sext",
          "❘": "VerticalSeparator",
          "⟈": "bsolhsub",
          "⟉": "suphsol",
          "⟵": "xlarr",
          "⟶": "xrarr",
          "⟷": "xharr",
          "⟸": "xlArr",
          "⟹": "xrArr",
          "⟺": "xhArr",
          "⟼": "xmap",
          "⟿": "dzigrarr",
          "⤂": "nvlArr",
          "⤃": "nvrArr",
          "⤄": "nvHarr",
          "⤅": "Map",
          "⤌": "lbarr",
          "⤍": "rbarr",
          "⤎": "lBarr",
          "⤏": "rBarr",
          "⤐": "RBarr",
          "⤑": "DDotrahd",
          "⤒": "UpArrowBar",
          "⤓": "DownArrowBar",
          "⤖": "Rarrtl",
          "⤙": "latail",
          "⤚": "ratail",
          "⤛": "lAtail",
          "⤜": "rAtail",
          "⤝": "larrfs",
          "⤞": "rarrfs",
          "⤟": "larrbfs",
          "⤠": "rarrbfs",
          "⤣": "nwarhk",
          "⤤": "nearhk",
          "⤥": "searhk",
          "⤦": "swarhk",
          "⤧": "nwnear",
          "⤨": "toea",
          "⤩": "tosa",
          "⤪": "swnwar",
          "⤳": "rarrc",
          "⤳̸": "nrarrc",
          "⤵": "cudarrr",
          "⤶": "ldca",
          "⤷": "rdca",
          "⤸": "cudarrl",
          "⤹": "larrpl",
          "⤼": "curarrm",
          "⤽": "cularrp",
          "⥅": "rarrpl",
          "⥈": "harrcir",
          "⥉": "Uarrocir",
          "⥊": "lurdshar",
          "⥋": "ldrushar",
          "⥎": "LeftRightVector",
          "⥏": "RightUpDownVector",
          "⥐": "DownLeftRightVector",
          "⥑": "LeftUpDownVector",
          "⥒": "LeftVectorBar",
          "⥓": "RightVectorBar",
          "⥔": "RightUpVectorBar",
          "⥕": "RightDownVectorBar",
          "⥖": "DownLeftVectorBar",
          "⥗": "DownRightVectorBar",
          "⥘": "LeftUpVectorBar",
          "⥙": "LeftDownVectorBar",
          "⥚": "LeftTeeVector",
          "⥛": "RightTeeVector",
          "⥜": "RightUpTeeVector",
          "⥝": "RightDownTeeVector",
          "⥞": "DownLeftTeeVector",
          "⥟": "DownRightTeeVector",
          "⥠": "LeftUpTeeVector",
          "⥡": "LeftDownTeeVector",
          "⥢": "lHar",
          "⥣": "uHar",
          "⥤": "rHar",
          "⥥": "dHar",
          "⥦": "luruhar",
          "⥧": "ldrdhar",
          "⥨": "ruluhar",
          "⥩": "rdldhar",
          "⥪": "lharul",
          "⥫": "llhard",
          "⥬": "rharul",
          "⥭": "lrhard",
          "⥮": "udhar",
          "⥯": "duhar",
          "⥰": "RoundImplies",
          "⥱": "erarr",
          "⥲": "simrarr",
          "⥳": "larrsim",
          "⥴": "rarrsim",
          "⥵": "rarrap",
          "⥶": "ltlarr",
          "⥸": "gtrarr",
          "⥹": "subrarr",
          "⥻": "suplarr",
          "⥼": "lfisht",
          "⥽": "rfisht",
          "⥾": "ufisht",
          "⥿": "dfisht",
          "⦚": "vzigzag",
          "⦜": "vangrt",
          "⦝": "angrtvbd",
          "⦤": "ange",
          "⦥": "range",
          "⦦": "dwangle",
          "⦧": "uwangle",
          "⦨": "angmsdaa",
          "⦩": "angmsdab",
          "⦪": "angmsdac",
          "⦫": "angmsdad",
          "⦬": "angmsdae",
          "⦭": "angmsdaf",
          "⦮": "angmsdag",
          "⦯": "angmsdah",
          "⦰": "bemptyv",
          "⦱": "demptyv",
          "⦲": "cemptyv",
          "⦳": "raemptyv",
          "⦴": "laemptyv",
          "⦵": "ohbar",
          "⦶": "omid",
          "⦷": "opar",
          "⦹": "operp",
          "⦻": "olcross",
          "⦼": "odsold",
          "⦾": "olcir",
          "⦿": "ofcir",
          "⧀": "olt",
          "⧁": "ogt",
          "⧂": "cirscir",
          "⧃": "cirE",
          "⧄": "solb",
          "⧅": "bsolb",
          "⧉": "boxbox",
          "⧍": "trisb",
          "⧎": "rtriltri",
          "⧏": "LeftTriangleBar",
          "⧏̸": "NotLeftTriangleBar",
          "⧐": "RightTriangleBar",
          "⧐̸": "NotRightTriangleBar",
          "⧜": "iinfin",
          "⧝": "infintie",
          "⧞": "nvinfin",
          "⧣": "eparsl",
          "⧤": "smeparsl",
          "⧥": "eqvparsl",
          "⧫": "lozf",
          "⧴": "RuleDelayed",
          "⧶": "dsol",
          "⨀": "xodot",
          "⨁": "xoplus",
          "⨂": "xotime",
          "⨄": "xuplus",
          "⨆": "xsqcup",
          "⨍": "fpartint",
          "⨐": "cirfnint",
          "⨑": "awint",
          "⨒": "rppolint",
          "⨓": "scpolint",
          "⨔": "npolint",
          "⨕": "pointint",
          "⨖": "quatint",
          "⨗": "intlarhk",
          "⨢": "pluscir",
          "⨣": "plusacir",
          "⨤": "simplus",
          "⨥": "plusdu",
          "⨦": "plussim",
          "⨧": "plustwo",
          "⨩": "mcomma",
          "⨪": "minusdu",
          "⨭": "loplus",
          "⨮": "roplus",
          "⨯": "Cross",
          "⨰": "timesd",
          "⨱": "timesbar",
          "⨳": "smashp",
          "⨴": "lotimes",
          "⨵": "rotimes",
          "⨶": "otimesas",
          "⨷": "Otimes",
          "⨸": "odiv",
          "⨹": "triplus",
          "⨺": "triminus",
          "⨻": "tritime",
          "⨼": "iprod",
          "⨿": "amalg",
          "⩀": "capdot",
          "⩂": "ncup",
          "⩃": "ncap",
          "⩄": "capand",
          "⩅": "cupor",
          "⩆": "cupcap",
          "⩇": "capcup",
          "⩈": "cupbrcap",
          "⩉": "capbrcup",
          "⩊": "cupcup",
          "⩋": "capcap",
          "⩌": "ccups",
          "⩍": "ccaps",
          "⩐": "ccupssm",
          "⩓": "And",
          "⩔": "Or",
          "⩕": "andand",
          "⩖": "oror",
          "⩗": "orslope",
          "⩘": "andslope",
          "⩚": "andv",
          "⩛": "orv",
          "⩜": "andd",
          "⩝": "ord",
          "⩟": "wedbar",
          "⩦": "sdote",
          "⩪": "simdot",
          "⩭": "congdot",
          "⩭̸": "ncongdot",
          "⩮": "easter",
          "⩯": "apacir",
          "⩰": "apE",
          "⩰̸": "napE",
          "⩱": "eplus",
          "⩲": "pluse",
          "⩳": "Esim",
          "⩷": "eDDot",
          "⩸": "equivDD",
          "⩹": "ltcir",
          "⩺": "gtcir",
          "⩻": "ltquest",
          "⩼": "gtquest",
          "⩽": "les",
          "⩽̸": "nles",
          "⩾": "ges",
          "⩾̸": "nges",
          "⩿": "lesdot",
          "⪀": "gesdot",
          "⪁": "lesdoto",
          "⪂": "gesdoto",
          "⪃": "lesdotor",
          "⪄": "gesdotol",
          "⪅": "lap",
          "⪆": "gap",
          "⪇": "lne",
          "⪈": "gne",
          "⪉": "lnap",
          "⪊": "gnap",
          "⪋": "lEg",
          "⪌": "gEl",
          "⪍": "lsime",
          "⪎": "gsime",
          "⪏": "lsimg",
          "⪐": "gsiml",
          "⪑": "lgE",
          "⪒": "glE",
          "⪓": "lesges",
          "⪔": "gesles",
          "⪕": "els",
          "⪖": "egs",
          "⪗": "elsdot",
          "⪘": "egsdot",
          "⪙": "el",
          "⪚": "eg",
          "⪝": "siml",
          "⪞": "simg",
          "⪟": "simlE",
          "⪠": "simgE",
          "⪡": "LessLess",
          "⪡̸": "NotNestedLessLess",
          "⪢": "GreaterGreater",
          "⪢̸": "NotNestedGreaterGreater",
          "⪤": "glj",
          "⪥": "gla",
          "⪦": "ltcc",
          "⪧": "gtcc",
          "⪨": "lescc",
          "⪩": "gescc",
          "⪪": "smt",
          "⪫": "lat",
          "⪬": "smte",
          "⪬︀": "smtes",
          "⪭": "late",
          "⪭︀": "lates",
          "⪮": "bumpE",
          "⪯": "pre",
          "⪯̸": "npre",
          "⪰": "sce",
          "⪰̸": "nsce",
          "⪳": "prE",
          "⪴": "scE",
          "⪵": "prnE",
          "⪶": "scnE",
          "⪷": "prap",
          "⪸": "scap",
          "⪹": "prnap",
          "⪺": "scnap",
          "⪻": "Pr",
          "⪼": "Sc",
          "⪽": "subdot",
          "⪾": "supdot",
          "⪿": "subplus",
          "⫀": "supplus",
          "⫁": "submult",
          "⫂": "supmult",
          "⫃": "subedot",
          "⫄": "supedot",
          "⫅": "subE",
          "⫅̸": "nsubE",
          "⫆": "supE",
          "⫆̸": "nsupE",
          "⫇": "subsim",
          "⫈": "supsim",
          "⫋︀": "vsubnE",
          "⫋": "subnE",
          "⫌︀": "vsupnE",
          "⫌": "supnE",
          "⫏": "csub",
          "⫐": "csup",
          "⫑": "csube",
          "⫒": "csupe",
          "⫓": "subsup",
          "⫔": "supsub",
          "⫕": "subsub",
          "⫖": "supsup",
          "⫗": "suphsub",
          "⫘": "supdsub",
          "⫙": "forkv",
          "⫚": "topfork",
          "⫛": "mlcp",
          "⫤": "Dashv",
          "⫦": "Vdashl",
          "⫧": "Barv",
          "⫨": "vBar",
          "⫩": "vBarv",
          "⫫": "Vbar",
          "⫬": "Not",
          "⫭": "bNot",
          "⫮": "rnmid",
          "⫯": "cirmid",
          "⫰": "midcir",
          "⫱": "topcir",
          "⫲": "nhpar",
          "⫳": "parsim",
          "⫽": "parsl",
          "⫽⃥": "nparsl",
          "♭": "flat",
          "♮": "natur",
          "♯": "sharp",
          "¤": "curren",
          "¢": "cent",
          $: "dollar",
          "£": "pound",
          "¥": "yen",
          "€": "euro",
          "¹": "sup1",
          "½": "half",
          "⅓": "frac13",
          "¼": "frac14",
          "⅕": "frac15",
          "⅙": "frac16",
          "⅛": "frac18",
          "²": "sup2",
          "⅔": "frac23",
          "⅖": "frac25",
          "³": "sup3",
          "¾": "frac34",
          "⅗": "frac35",
          "⅜": "frac38",
          "⅘": "frac45",
          "⅚": "frac56",
          "⅝": "frac58",
          "⅞": "frac78",
          "𝒶": "ascr",
          "𝕒": "aopf",
          "𝔞": "afr",
          "𝔸": "Aopf",
          "𝔄": "Afr",
          "𝒜": "Ascr",
          ª: "ordf",
          á: "aacute",
          Á: "Aacute",
          à: "agrave",
          À: "Agrave",
          ă: "abreve",
          Ă: "Abreve",
          â: "acirc",
          Â: "Acirc",
          å: "aring",
          Å: "angst",
          ä: "auml",
          Ä: "Auml",
          ã: "atilde",
          Ã: "Atilde",
          ą: "aogon",
          Ą: "Aogon",
          ā: "amacr",
          Ā: "Amacr",
          æ: "aelig",
          Æ: "AElig",
          "𝒷": "bscr",
          "𝕓": "bopf",
          "𝔟": "bfr",
          "𝔹": "Bopf",
          ℬ: "Bscr",
          "𝔅": "Bfr",
          "𝔠": "cfr",
          "𝒸": "cscr",
          "𝕔": "copf",
          ℭ: "Cfr",
          "𝒞": "Cscr",
          ℂ: "Copf",
          ć: "cacute",
          Ć: "Cacute",
          ĉ: "ccirc",
          Ĉ: "Ccirc",
          č: "ccaron",
          Č: "Ccaron",
          ċ: "cdot",
          Ċ: "Cdot",
          ç: "ccedil",
          Ç: "Ccedil",
          "℅": "incare",
          "𝔡": "dfr",
          ⅆ: "dd",
          "𝕕": "dopf",
          "𝒹": "dscr",
          "𝒟": "Dscr",
          "𝔇": "Dfr",
          ⅅ: "DD",
          "𝔻": "Dopf",
          ď: "dcaron",
          Ď: "Dcaron",
          đ: "dstrok",
          Đ: "Dstrok",
          ð: "eth",
          Ð: "ETH",
          ⅇ: "ee",
          ℯ: "escr",
          "𝔢": "efr",
          "𝕖": "eopf",
          ℰ: "Escr",
          "𝔈": "Efr",
          "𝔼": "Eopf",
          é: "eacute",
          É: "Eacute",
          è: "egrave",
          È: "Egrave",
          ê: "ecirc",
          Ê: "Ecirc",
          ě: "ecaron",
          Ě: "Ecaron",
          ë: "euml",
          Ë: "Euml",
          ė: "edot",
          Ė: "Edot",
          ę: "eogon",
          Ę: "Eogon",
          ē: "emacr",
          Ē: "Emacr",
          "𝔣": "ffr",
          "𝕗": "fopf",
          "𝒻": "fscr",
          "𝔉": "Ffr",
          "𝔽": "Fopf",
          ℱ: "Fscr",
          ﬀ: "fflig",
          ﬃ: "ffilig",
          ﬄ: "ffllig",
          ﬁ: "filig",
          fj: "fjlig",
          ﬂ: "fllig",
          ƒ: "fnof",
          ℊ: "gscr",
          "𝕘": "gopf",
          "𝔤": "gfr",
          "𝒢": "Gscr",
          "𝔾": "Gopf",
          "𝔊": "Gfr",
          ǵ: "gacute",
          ğ: "gbreve",
          Ğ: "Gbreve",
          ĝ: "gcirc",
          Ĝ: "Gcirc",
          ġ: "gdot",
          Ġ: "Gdot",
          Ģ: "Gcedil",
          "𝔥": "hfr",
          ℎ: "planckh",
          "𝒽": "hscr",
          "𝕙": "hopf",
          ℋ: "Hscr",
          ℌ: "Hfr",
          ℍ: "Hopf",
          ĥ: "hcirc",
          Ĥ: "Hcirc",
          ℏ: "hbar",
          ħ: "hstrok",
          Ħ: "Hstrok",
          "𝕚": "iopf",
          "𝔦": "ifr",
          "𝒾": "iscr",
          ⅈ: "ii",
          "𝕀": "Iopf",
          ℐ: "Iscr",
          ℑ: "Im",
          í: "iacute",
          Í: "Iacute",
          ì: "igrave",
          Ì: "Igrave",
          î: "icirc",
          Î: "Icirc",
          ï: "iuml",
          Ï: "Iuml",
          ĩ: "itilde",
          Ĩ: "Itilde",
          İ: "Idot",
          į: "iogon",
          Į: "Iogon",
          ī: "imacr",
          Ī: "Imacr",
          ĳ: "ijlig",
          Ĳ: "IJlig",
          ı: "imath",
          "𝒿": "jscr",
          "𝕛": "jopf",
          "𝔧": "jfr",
          "𝒥": "Jscr",
          "𝔍": "Jfr",
          "𝕁": "Jopf",
          ĵ: "jcirc",
          Ĵ: "Jcirc",
          ȷ: "jmath",
          "𝕜": "kopf",
          "𝓀": "kscr",
          "𝔨": "kfr",
          "𝒦": "Kscr",
          "𝕂": "Kopf",
          "𝔎": "Kfr",
          ķ: "kcedil",
          Ķ: "Kcedil",
          "𝔩": "lfr",
          "𝓁": "lscr",
          ℓ: "ell",
          "𝕝": "lopf",
          ℒ: "Lscr",
          "𝔏": "Lfr",
          "𝕃": "Lopf",
          ĺ: "lacute",
          Ĺ: "Lacute",
          ľ: "lcaron",
          Ľ: "Lcaron",
          ļ: "lcedil",
          Ļ: "Lcedil",
          ł: "lstrok",
          Ł: "Lstrok",
          ŀ: "lmidot",
          Ŀ: "Lmidot",
          "𝔪": "mfr",
          "𝕞": "mopf",
          "𝓂": "mscr",
          "𝔐": "Mfr",
          "𝕄": "Mopf",
          ℳ: "Mscr",
          "𝔫": "nfr",
          "𝕟": "nopf",
          "𝓃": "nscr",
          ℕ: "Nopf",
          "𝒩": "Nscr",
          "𝔑": "Nfr",
          ń: "nacute",
          Ń: "Nacute",
          ň: "ncaron",
          Ň: "Ncaron",
          ñ: "ntilde",
          Ñ: "Ntilde",
          ņ: "ncedil",
          Ņ: "Ncedil",
          "№": "numero",
          ŋ: "eng",
          Ŋ: "ENG",
          "𝕠": "oopf",
          "𝔬": "ofr",
          ℴ: "oscr",
          "𝒪": "Oscr",
          "𝔒": "Ofr",
          "𝕆": "Oopf",
          º: "ordm",
          ó: "oacute",
          Ó: "Oacute",
          ò: "ograve",
          Ò: "Ograve",
          ô: "ocirc",
          Ô: "Ocirc",
          ö: "ouml",
          Ö: "Ouml",
          ő: "odblac",
          Ő: "Odblac",
          õ: "otilde",
          Õ: "Otilde",
          ø: "oslash",
          Ø: "Oslash",
          ō: "omacr",
          Ō: "Omacr",
          œ: "oelig",
          Œ: "OElig",
          "𝔭": "pfr",
          "𝓅": "pscr",
          "𝕡": "popf",
          ℙ: "Popf",
          "𝔓": "Pfr",
          "𝒫": "Pscr",
          "𝕢": "qopf",
          "𝔮": "qfr",
          "𝓆": "qscr",
          "𝒬": "Qscr",
          "𝔔": "Qfr",
          ℚ: "Qopf",
          ĸ: "kgreen",
          "𝔯": "rfr",
          "𝕣": "ropf",
          "𝓇": "rscr",
          ℛ: "Rscr",
          ℜ: "Re",
          ℝ: "Ropf",
          ŕ: "racute",
          Ŕ: "Racute",
          ř: "rcaron",
          Ř: "Rcaron",
          ŗ: "rcedil",
          Ŗ: "Rcedil",
          "𝕤": "sopf",
          "𝓈": "sscr",
          "𝔰": "sfr",
          "𝕊": "Sopf",
          "𝔖": "Sfr",
          "𝒮": "Sscr",
          "Ⓢ": "oS",
          ś: "sacute",
          Ś: "Sacute",
          ŝ: "scirc",
          Ŝ: "Scirc",
          š: "scaron",
          Š: "Scaron",
          ş: "scedil",
          Ş: "Scedil",
          ß: "szlig",
          "𝔱": "tfr",
          "𝓉": "tscr",
          "𝕥": "topf",
          "𝒯": "Tscr",
          "𝔗": "Tfr",
          "𝕋": "Topf",
          ť: "tcaron",
          Ť: "Tcaron",
          ţ: "tcedil",
          Ţ: "Tcedil",
          "™": "trade",
          ŧ: "tstrok",
          Ŧ: "Tstrok",
          "𝓊": "uscr",
          "𝕦": "uopf",
          "𝔲": "ufr",
          "𝕌": "Uopf",
          "𝔘": "Ufr",
          "𝒰": "Uscr",
          ú: "uacute",
          Ú: "Uacute",
          ù: "ugrave",
          Ù: "Ugrave",
          ŭ: "ubreve",
          Ŭ: "Ubreve",
          û: "ucirc",
          Û: "Ucirc",
          ů: "uring",
          Ů: "Uring",
          ü: "uuml",
          Ü: "Uuml",
          ű: "udblac",
          Ű: "Udblac",
          ũ: "utilde",
          Ũ: "Utilde",
          ų: "uogon",
          Ų: "Uogon",
          ū: "umacr",
          Ū: "Umacr",
          "𝔳": "vfr",
          "𝕧": "vopf",
          "𝓋": "vscr",
          "𝔙": "Vfr",
          "𝕍": "Vopf",
          "𝒱": "Vscr",
          "𝕨": "wopf",
          "𝓌": "wscr",
          "𝔴": "wfr",
          "𝒲": "Wscr",
          "𝕎": "Wopf",
          "𝔚": "Wfr",
          ŵ: "wcirc",
          Ŵ: "Wcirc",
          "𝔵": "xfr",
          "𝓍": "xscr",
          "𝕩": "xopf",
          "𝕏": "Xopf",
          "𝔛": "Xfr",
          "𝒳": "Xscr",
          "𝔶": "yfr",
          "𝓎": "yscr",
          "𝕪": "yopf",
          "𝒴": "Yscr",
          "𝔜": "Yfr",
          "𝕐": "Yopf",
          ý: "yacute",
          Ý: "Yacute",
          ŷ: "ycirc",
          Ŷ: "Ycirc",
          ÿ: "yuml",
          Ÿ: "Yuml",
          "𝓏": "zscr",
          "𝔷": "zfr",
          "𝕫": "zopf",
          ℨ: "Zfr",
          ℤ: "Zopf",
          "𝒵": "Zscr",
          ź: "zacute",
          Ź: "Zacute",
          ž: "zcaron",
          Ž: "Zcaron",
          ż: "zdot",
          Ż: "Zdot",
          Ƶ: "imped",
          þ: "thorn",
          Þ: "THORN",
          ŉ: "napos",
          α: "alpha",
          Α: "Alpha",
          β: "beta",
          Β: "Beta",
          γ: "gamma",
          Γ: "Gamma",
          δ: "delta",
          Δ: "Delta",
          ε: "epsi",
          ϵ: "epsiv",
          Ε: "Epsilon",
          ϝ: "gammad",
          Ϝ: "Gammad",
          ζ: "zeta",
          Ζ: "Zeta",
          η: "eta",
          Η: "Eta",
          θ: "theta",
          ϑ: "thetav",
          Θ: "Theta",
          ι: "iota",
          Ι: "Iota",
          κ: "kappa",
          ϰ: "kappav",
          Κ: "Kappa",
          λ: "lambda",
          Λ: "Lambda",
          μ: "mu",
          µ: "micro",
          Μ: "Mu",
          ν: "nu",
          Ν: "Nu",
          ξ: "xi",
          Ξ: "Xi",
          ο: "omicron",
          Ο: "Omicron",
          π: "pi",
          ϖ: "piv",
          Π: "Pi",
          ρ: "rho",
          ϱ: "rhov",
          Ρ: "Rho",
          σ: "sigma",
          Σ: "Sigma",
          ς: "sigmaf",
          τ: "tau",
          Τ: "Tau",
          υ: "upsi",
          Υ: "Upsilon",
          ϒ: "Upsi",
          φ: "phi",
          ϕ: "phiv",
          Φ: "Phi",
          χ: "chi",
          Χ: "Chi",
          ψ: "psi",
          Ψ: "Psi",
          ω: "omega",
          Ω: "ohm",
          а: "acy",
          А: "Acy",
          б: "bcy",
          Б: "Bcy",
          в: "vcy",
          В: "Vcy",
          г: "gcy",
          Г: "Gcy",
          ѓ: "gjcy",
          Ѓ: "GJcy",
          д: "dcy",
          Д: "Dcy",
          ђ: "djcy",
          Ђ: "DJcy",
          е: "iecy",
          Е: "IEcy",
          ё: "iocy",
          Ё: "IOcy",
          є: "jukcy",
          Є: "Jukcy",
          ж: "zhcy",
          Ж: "ZHcy",
          з: "zcy",
          З: "Zcy",
          ѕ: "dscy",
          Ѕ: "DScy",
          и: "icy",
          И: "Icy",
          і: "iukcy",
          І: "Iukcy",
          ї: "yicy",
          Ї: "YIcy",
          й: "jcy",
          Й: "Jcy",
          ј: "jsercy",
          Ј: "Jsercy",
          к: "kcy",
          К: "Kcy",
          ќ: "kjcy",
          Ќ: "KJcy",
          л: "lcy",
          Л: "Lcy",
          љ: "ljcy",
          Љ: "LJcy",
          м: "mcy",
          М: "Mcy",
          н: "ncy",
          Н: "Ncy",
          њ: "njcy",
          Њ: "NJcy",
          о: "ocy",
          О: "Ocy",
          п: "pcy",
          П: "Pcy",
          р: "rcy",
          Р: "Rcy",
          с: "scy",
          С: "Scy",
          т: "tcy",
          Т: "Tcy",
          ћ: "tshcy",
          Ћ: "TSHcy",
          у: "ucy",
          У: "Ucy",
          ў: "ubrcy",
          Ў: "Ubrcy",
          ф: "fcy",
          Ф: "Fcy",
          х: "khcy",
          Х: "KHcy",
          ц: "tscy",
          Ц: "TScy",
          ч: "chcy",
          Ч: "CHcy",
          џ: "dzcy",
          Џ: "DZcy",
          ш: "shcy",
          Ш: "SHcy",
          щ: "shchcy",
          Щ: "SHCHcy",
          ъ: "hardcy",
          Ъ: "HARDcy",
          ы: "ycy",
          Ы: "Ycy",
          ь: "softcy",
          Ь: "SOFTcy",
          э: "ecy",
          Э: "Ecy",
          ю: "yucy",
          Ю: "YUcy",
          я: "yacy",
          Я: "YAcy",
          ℵ: "aleph",
          ℶ: "beth",
          ℷ: "gimel",
          ℸ: "daleth",
        },
        p = /["&'<>`]/g,
        h = {
          '"': "&quot;",
          "&": "&amp;",
          "'": "&#x27;",
          "<": "&lt;",
          ">": "&gt;",
          "`": "&#x60;",
        },
        d = /&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/,
        g =
          /[\0-\x08\x0B\x0E-\x1F\x7F-\x9F\uFDD0-\uFDEF\uFFFE\uFFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,
        m =
          /&(CounterClockwiseContourIntegral|DoubleLongLeftRightArrow|ClockwiseContourIntegral|NotNestedGreaterGreater|NotSquareSupersetEqual|DiacriticalDoubleAcute|NotRightTriangleEqual|NotSucceedsSlantEqual|NotPrecedesSlantEqual|CloseCurlyDoubleQuote|NegativeVeryThinSpace|DoubleContourIntegral|FilledVerySmallSquare|CapitalDifferentialD|OpenCurlyDoubleQuote|EmptyVerySmallSquare|NestedGreaterGreater|DoubleLongRightArrow|NotLeftTriangleEqual|NotGreaterSlantEqual|ReverseUpEquilibrium|DoubleLeftRightArrow|NotSquareSubsetEqual|NotDoubleVerticalBar|RightArrowLeftArrow|NotGreaterFullEqual|NotRightTriangleBar|SquareSupersetEqual|DownLeftRightVector|DoubleLongLeftArrow|leftrightsquigarrow|LeftArrowRightArrow|NegativeMediumSpace|blacktriangleright|RightDownVectorBar|PrecedesSlantEqual|RightDoubleBracket|SucceedsSlantEqual|NotLeftTriangleBar|RightTriangleEqual|SquareIntersection|RightDownTeeVector|ReverseEquilibrium|NegativeThickSpace|longleftrightarrow|Longleftrightarrow|LongLeftRightArrow|DownRightTeeVector|DownRightVectorBar|GreaterSlantEqual|SquareSubsetEqual|LeftDownVectorBar|LeftDoubleBracket|VerticalSeparator|rightleftharpoons|NotGreaterGreater|NotSquareSuperset|blacktriangleleft|blacktriangledown|NegativeThinSpace|LeftDownTeeVector|NotLessSlantEqual|leftrightharpoons|DoubleUpDownArrow|DoubleVerticalBar|LeftTriangleEqual|FilledSmallSquare|twoheadrightarrow|NotNestedLessLess|DownLeftTeeVector|DownLeftVectorBar|RightAngleBracket|NotTildeFullEqual|NotReverseElement|RightUpDownVector|DiacriticalTilde|NotSucceedsTilde|circlearrowright|NotPrecedesEqual|rightharpoondown|DoubleRightArrow|NotSucceedsEqual|NonBreakingSpace|NotRightTriangle|LessEqualGreater|RightUpTeeVector|LeftAngleBracket|GreaterFullEqual|DownArrowUpArrow|RightUpVectorBar|twoheadleftarrow|GreaterEqualLess|downharpoonright|RightTriangleBar|ntrianglerighteq|NotSupersetEqual|LeftUpDownVector|DiacriticalAcute|rightrightarrows|vartriangleright|UpArrowDownArrow|DiacriticalGrave|UnderParenthesis|EmptySmallSquare|LeftUpVectorBar|leftrightarrows|DownRightVector|downharpoonleft|trianglerighteq|ShortRightArrow|OverParenthesis|DoubleLeftArrow|DoubleDownArrow|NotSquareSubset|bigtriangledown|ntrianglelefteq|UpperRightArrow|curvearrowright|vartriangleleft|NotLeftTriangle|nleftrightarrow|LowerRightArrow|NotHumpDownHump|NotGreaterTilde|rightthreetimes|LeftUpTeeVector|NotGreaterEqual|straightepsilon|LeftTriangleBar|rightsquigarrow|ContourIntegral|rightleftarrows|CloseCurlyQuote|RightDownVector|LeftRightVector|nLeftrightarrow|leftharpoondown|circlearrowleft|SquareSuperset|OpenCurlyQuote|hookrightarrow|HorizontalLine|DiacriticalDot|NotLessGreater|ntriangleright|DoubleRightTee|InvisibleComma|InvisibleTimes|LowerLeftArrow|DownLeftVector|NotSubsetEqual|curvearrowleft|trianglelefteq|NotVerticalBar|TildeFullEqual|downdownarrows|NotGreaterLess|RightTeeVector|ZeroWidthSpace|looparrowright|LongRightArrow|doublebarwedge|ShortLeftArrow|ShortDownArrow|RightVectorBar|GreaterGreater|ReverseElement|rightharpoonup|LessSlantEqual|leftthreetimes|upharpoonright|rightarrowtail|LeftDownVector|Longrightarrow|NestedLessLess|UpperLeftArrow|nshortparallel|leftleftarrows|leftrightarrow|Leftrightarrow|LeftRightArrow|longrightarrow|upharpoonleft|RightArrowBar|ApplyFunction|LeftTeeVector|leftarrowtail|NotEqualTilde|varsubsetneqq|varsupsetneqq|RightTeeArrow|SucceedsEqual|SucceedsTilde|LeftVectorBar|SupersetEqual|hookleftarrow|DifferentialD|VerticalTilde|VeryThinSpace|blacktriangle|bigtriangleup|LessFullEqual|divideontimes|leftharpoonup|UpEquilibrium|ntriangleleft|RightTriangle|measuredangle|shortparallel|longleftarrow|Longleftarrow|LongLeftArrow|DoubleLeftTee|Poincareplane|PrecedesEqual|triangleright|DoubleUpArrow|RightUpVector|fallingdotseq|looparrowleft|PrecedesTilde|NotTildeEqual|NotTildeTilde|smallsetminus|Proportional|triangleleft|triangledown|UnderBracket|NotHumpEqual|exponentiale|ExponentialE|NotLessTilde|HilbertSpace|RightCeiling|blacklozenge|varsupsetneq|HumpDownHump|GreaterEqual|VerticalLine|LeftTeeArrow|NotLessEqual|DownTeeArrow|LeftTriangle|varsubsetneq|Intersection|NotCongruent|DownArrowBar|LeftUpVector|LeftArrowBar|risingdotseq|GreaterTilde|RoundImplies|SquareSubset|ShortUpArrow|NotSuperset|quaternions|precnapprox|backepsilon|preccurlyeq|OverBracket|blacksquare|MediumSpace|VerticalBar|circledcirc|circleddash|CircleMinus|CircleTimes|LessGreater|curlyeqprec|curlyeqsucc|diamondsuit|UpDownArrow|Updownarrow|RuleDelayed|Rrightarrow|updownarrow|RightVector|nRightarrow|nrightarrow|eqslantless|LeftCeiling|Equilibrium|SmallCircle|expectation|NotSucceeds|thickapprox|GreaterLess|SquareUnion|NotPrecedes|NotLessLess|straightphi|succnapprox|succcurlyeq|SubsetEqual|sqsupseteq|Proportion|Laplacetrf|ImaginaryI|supsetneqq|NotGreater|gtreqqless|NotElement|ThickSpace|TildeEqual|TildeTilde|Fouriertrf|rmoustache|EqualTilde|eqslantgtr|UnderBrace|LeftVector|UpArrowBar|nLeftarrow|nsubseteqq|subsetneqq|nsupseteqq|nleftarrow|succapprox|lessapprox|UpTeeArrow|upuparrows|curlywedge|lesseqqgtr|varepsilon|varnothing|RightFloor|complement|CirclePlus|sqsubseteq|Lleftarrow|circledast|RightArrow|Rightarrow|rightarrow|lmoustache|Bernoullis|precapprox|mapstoleft|mapstodown|longmapsto|dotsquare|downarrow|DoubleDot|nsubseteq|supsetneq|leftarrow|nsupseteq|subsetneq|ThinSpace|ngeqslant|subseteqq|HumpEqual|NotSubset|triangleq|NotCupCap|lesseqgtr|heartsuit|TripleDot|Leftarrow|Coproduct|Congruent|varpropto|complexes|gvertneqq|LeftArrow|LessTilde|supseteqq|MinusPlus|CircleDot|nleqslant|NotExists|gtreqless|nparallel|UnionPlus|LeftFloor|checkmark|CenterDot|centerdot|Mellintrf|gtrapprox|bigotimes|OverBrace|spadesuit|therefore|pitchfork|rationals|PlusMinus|Backslash|Therefore|DownBreve|backsimeq|backprime|DownArrow|nshortmid|Downarrow|lvertneqq|eqvparsl|imagline|imagpart|infintie|integers|Integral|intercal|LessLess|Uarrocir|intlarhk|sqsupset|angmsdaf|sqsubset|llcorner|vartheta|cupbrcap|lnapprox|Superset|SuchThat|succnsim|succneqq|angmsdag|biguplus|curlyvee|trpezium|Succeeds|NotTilde|bigwedge|angmsdah|angrtvbd|triminus|cwconint|fpartint|lrcorner|smeparsl|subseteq|urcorner|lurdshar|laemptyv|DDotrahd|approxeq|ldrushar|awconint|mapstoup|backcong|shortmid|triangle|geqslant|gesdotol|timesbar|circledR|circledS|setminus|multimap|naturals|scpolint|ncongdot|RightTee|boxminus|gnapprox|boxtimes|andslope|thicksim|angmsdaa|varsigma|cirfnint|rtriltri|angmsdab|rppolint|angmsdac|barwedge|drbkarow|clubsuit|thetasym|bsolhsub|capbrcup|dzigrarr|doteqdot|DotEqual|dotminus|UnderBar|NotEqual|realpart|otimesas|ulcorner|hksearow|hkswarow|parallel|PartialD|elinters|emptyset|plusacir|bbrktbrk|angmsdad|pointint|bigoplus|angmsdae|Precedes|bigsqcup|varkappa|notindot|supseteq|precneqq|precnsim|profalar|profline|profsurf|leqslant|lesdotor|raemptyv|subplus|notnivb|notnivc|subrarr|zigrarr|vzigzag|submult|subedot|Element|between|cirscir|larrbfs|larrsim|lotimes|lbrksld|lbrkslu|lozenge|ldrdhar|dbkarow|bigcirc|epsilon|simrarr|simplus|ltquest|Epsilon|luruhar|gtquest|maltese|npolint|eqcolon|npreceq|bigodot|ddagger|gtrless|bnequiv|harrcir|ddotseq|equivDD|backsim|demptyv|nsqsube|nsqsupe|Upsilon|nsubset|upsilon|minusdu|nsucceq|swarrow|nsupset|coloneq|searrow|boxplus|napprox|natural|asympeq|alefsym|congdot|nearrow|bigstar|diamond|supplus|tritime|LeftTee|nvinfin|triplus|NewLine|nvltrie|nvrtrie|nwarrow|nexists|Diamond|ruluhar|Implies|supmult|angzarr|suplarr|suphsub|questeq|because|digamma|Because|olcross|bemptyv|omicron|Omicron|rotimes|NoBreak|intprod|angrtvb|orderof|uwangle|suphsol|lesdoto|orslope|DownTee|realine|cudarrl|rdldhar|OverBar|supedot|lessdot|supdsub|topfork|succsim|rbrkslu|rbrksld|pertenk|cudarrr|isindot|planckh|lessgtr|pluscir|gesdoto|plussim|plustwo|lesssim|cularrp|rarrsim|Cayleys|notinva|notinvb|notinvc|UpArrow|Uparrow|uparrow|NotLess|dwangle|precsim|Product|curarrm|Cconint|dotplus|rarrbfs|ccupssm|Cedilla|cemptyv|notniva|quatint|frac35|frac38|frac45|frac56|frac58|frac78|tridot|xoplus|gacute|gammad|Gammad|lfisht|lfloor|bigcup|sqsupe|gbreve|Gbreve|lharul|sqsube|sqcups|Gcedil|apacir|llhard|lmidot|Lmidot|lmoust|andand|sqcaps|approx|Abreve|spades|circeq|tprime|divide|topcir|Assign|topbot|gesdot|divonx|xuplus|timesd|gesles|atilde|solbar|SOFTcy|loplus|timesb|lowast|lowbar|dlcorn|dlcrop|softcy|dollar|lparlt|thksim|lrhard|Atilde|lsaquo|smashp|bigvee|thinsp|wreath|bkarow|lsquor|lstrok|Lstrok|lthree|ltimes|ltlarr|DotDot|simdot|ltrPar|weierp|xsqcup|angmsd|sigmav|sigmaf|zeetrf|Zcaron|zcaron|mapsto|vsupne|thetav|cirmid|marker|mcomma|Zacute|vsubnE|there4|gtlPar|vsubne|bottom|gtrarr|SHCHcy|shchcy|midast|midcir|middot|minusb|minusd|gtrdot|bowtie|sfrown|mnplus|models|colone|seswar|Colone|mstpos|searhk|gtrsim|nacute|Nacute|boxbox|telrec|hairsp|Tcedil|nbumpe|scnsim|ncaron|Ncaron|ncedil|Ncedil|hamilt|Scedil|nearhk|hardcy|HARDcy|tcedil|Tcaron|commat|nequiv|nesear|tcaron|target|hearts|nexist|varrho|scedil|Scaron|scaron|hellip|Sacute|sacute|hercon|swnwar|compfn|rtimes|rthree|rsquor|rsaquo|zacute|wedgeq|homtht|barvee|barwed|Barwed|rpargt|horbar|conint|swarhk|roplus|nltrie|hslash|hstrok|Hstrok|rmoust|Conint|bprime|hybull|hyphen|iacute|Iacute|supsup|supsub|supsim|varphi|coprod|brvbar|agrave|Supset|supset|igrave|Igrave|notinE|Agrave|iiiint|iinfin|copysr|wedbar|Verbar|vangrt|becaus|incare|verbar|inodot|bullet|drcorn|intcal|drcrop|cularr|vellip|Utilde|bumpeq|cupcap|dstrok|Dstrok|CupCap|cupcup|cupdot|eacute|Eacute|supdot|iquest|easter|ecaron|Ecaron|ecolon|isinsv|utilde|itilde|Itilde|curarr|succeq|Bumpeq|cacute|ulcrop|nparsl|Cacute|nprcue|egrave|Egrave|nrarrc|nrarrw|subsup|subsub|nrtrie|jsercy|nsccue|Jsercy|kappav|kcedil|Kcedil|subsim|ulcorn|nsimeq|egsdot|veebar|kgreen|capand|elsdot|Subset|subset|curren|aacute|lacute|Lacute|emptyv|ntilde|Ntilde|lagran|lambda|Lambda|capcap|Ugrave|langle|subdot|emsp13|numero|emsp14|nvdash|nvDash|nVdash|nVDash|ugrave|ufisht|nvHarr|larrfs|nvlArr|larrhk|larrlp|larrpl|nvrArr|Udblac|nwarhk|larrtl|nwnear|oacute|Oacute|latail|lAtail|sstarf|lbrace|odblac|Odblac|lbrack|udblac|odsold|eparsl|lcaron|Lcaron|ograve|Ograve|lcedil|Lcedil|Aacute|ssmile|ssetmn|squarf|ldquor|capcup|ominus|cylcty|rharul|eqcirc|dagger|rfloor|rfisht|Dagger|daleth|equals|origof|capdot|equest|dcaron|Dcaron|rdquor|oslash|Oslash|otilde|Otilde|otimes|Otimes|urcrop|Ubreve|ubreve|Yacute|Uacute|uacute|Rcedil|rcedil|urcorn|parsim|Rcaron|Vdashl|rcaron|Tstrok|percnt|period|permil|Exists|yacute|rbrack|rbrace|phmmat|ccaron|Ccaron|planck|ccedil|plankv|tstrok|female|plusdo|plusdu|ffilig|plusmn|ffllig|Ccedil|rAtail|dfisht|bernou|ratail|Rarrtl|rarrtl|angsph|rarrpl|rarrlp|rarrhk|xwedge|xotime|forall|ForAll|Vvdash|vsupnE|preceq|bigcap|frac12|frac13|frac14|primes|rarrfs|prnsim|frac15|Square|frac16|square|lesdot|frac18|frac23|propto|prurel|rarrap|rangle|puncsp|frac25|Racute|qprime|racute|lesges|frac34|abreve|AElig|eqsim|utdot|setmn|urtri|Equal|Uring|seArr|uring|searr|dashv|Dashv|mumap|nabla|iogon|Iogon|sdote|sdotb|scsim|napid|napos|equiv|natur|Acirc|dblac|erarr|nbump|iprod|erDot|ucirc|awint|esdot|angrt|ncong|isinE|scnap|Scirc|scirc|ndash|isins|Ubrcy|nearr|neArr|isinv|nedot|ubrcy|acute|Ycirc|iukcy|Iukcy|xutri|nesim|caret|jcirc|Jcirc|caron|twixt|ddarr|sccue|exist|jmath|sbquo|ngeqq|angst|ccaps|lceil|ngsim|UpTee|delta|Delta|rtrif|nharr|nhArr|nhpar|rtrie|jukcy|Jukcy|kappa|rsquo|Kappa|nlarr|nlArr|TSHcy|rrarr|aogon|Aogon|fflig|xrarr|tshcy|ccirc|nleqq|filig|upsih|nless|dharl|nlsim|fjlig|ropar|nltri|dharr|robrk|roarr|fllig|fltns|roang|rnmid|subnE|subne|lAarr|trisb|Ccirc|acirc|ccups|blank|VDash|forkv|Vdash|langd|cedil|blk12|blk14|laquo|strns|diams|notin|vDash|larrb|blk34|block|disin|uplus|vdash|vBarv|aelig|starf|Wedge|check|xrArr|lates|lbarr|lBarr|notni|lbbrk|bcong|frasl|lbrke|frown|vrtri|vprop|vnsup|gamma|Gamma|wedge|xodot|bdquo|srarr|doteq|ldquo|boxdl|boxdL|gcirc|Gcirc|boxDl|boxDL|boxdr|boxdR|boxDr|TRADE|trade|rlhar|boxDR|vnsub|npart|vltri|rlarr|boxhd|boxhD|nprec|gescc|nrarr|nrArr|boxHd|boxHD|boxhu|boxhU|nrtri|boxHu|clubs|boxHU|times|colon|Colon|gimel|xlArr|Tilde|nsime|tilde|nsmid|nspar|THORN|thorn|xlarr|nsube|nsubE|thkap|xhArr|comma|nsucc|boxul|boxuL|nsupe|nsupE|gneqq|gnsim|boxUl|boxUL|grave|boxur|boxuR|boxUr|boxUR|lescc|angle|bepsi|boxvh|varpi|boxvH|numsp|Theta|gsime|gsiml|theta|boxVh|boxVH|boxvl|gtcir|gtdot|boxvL|boxVl|boxVL|crarr|cross|Cross|nvsim|boxvr|nwarr|nwArr|sqsup|dtdot|Uogon|lhard|lharu|dtrif|ocirc|Ocirc|lhblk|duarr|odash|sqsub|Hacek|sqcup|llarr|duhar|oelig|OElig|ofcir|boxvR|uogon|lltri|boxVr|csube|uuarr|ohbar|csupe|ctdot|olarr|olcir|harrw|oline|sqcap|omacr|Omacr|omega|Omega|boxVR|aleph|lneqq|lnsim|loang|loarr|rharu|lobrk|hcirc|operp|oplus|rhard|Hcirc|orarr|Union|order|ecirc|Ecirc|cuepr|szlig|cuesc|breve|reals|eDDot|Breve|hoarr|lopar|utrif|rdquo|Umacr|umacr|efDot|swArr|ultri|alpha|rceil|ovbar|swarr|Wcirc|wcirc|smtes|smile|bsemi|lrarr|aring|parsl|lrhar|bsime|uhblk|lrtri|cupor|Aring|uharr|uharl|slarr|rbrke|bsolb|lsime|rbbrk|RBarr|lsimg|phone|rBarr|rbarr|icirc|lsquo|Icirc|emacr|Emacr|ratio|simne|plusb|simlE|simgE|simeq|pluse|ltcir|ltdot|empty|xharr|xdtri|iexcl|Alpha|ltrie|rarrw|pound|ltrif|xcirc|bumpe|prcue|bumpE|asymp|amacr|cuvee|Sigma|sigma|iiint|udhar|iiota|ijlig|IJlig|supnE|imacr|Imacr|prime|Prime|image|prnap|eogon|Eogon|rarrc|mdash|mDDot|cuwed|imath|supne|imped|Amacr|udarr|prsim|micro|rarrb|cwint|raquo|infin|eplus|range|rangd|Ucirc|radic|minus|amalg|veeeq|rAarr|epsiv|ycirc|quest|sharp|quot|zwnj|Qscr|race|qscr|Qopf|qopf|qint|rang|Rang|Zscr|zscr|Zopf|zopf|rarr|rArr|Rarr|Pscr|pscr|prop|prod|prnE|prec|ZHcy|zhcy|prap|Zeta|zeta|Popf|popf|Zdot|plus|zdot|Yuml|yuml|phiv|YUcy|yucy|Yscr|yscr|perp|Yopf|yopf|part|para|YIcy|Ouml|rcub|yicy|YAcy|rdca|ouml|osol|Oscr|rdsh|yacy|real|oscr|xvee|andd|rect|andv|Xscr|oror|ordm|ordf|xscr|ange|aopf|Aopf|rHar|Xopf|opar|Oopf|xopf|xnis|rhov|oopf|omid|xmap|oint|apid|apos|ogon|ascr|Ascr|odot|odiv|xcup|xcap|ocir|oast|nvlt|nvle|nvgt|nvge|nvap|Wscr|wscr|auml|ntlg|ntgl|nsup|nsub|nsim|Nscr|nscr|nsce|Wopf|ring|npre|wopf|npar|Auml|Barv|bbrk|Nopf|nopf|nmid|nLtv|beta|ropf|Ropf|Beta|beth|nles|rpar|nleq|bnot|bNot|nldr|NJcy|rscr|Rscr|Vscr|vscr|rsqb|njcy|bopf|nisd|Bopf|rtri|Vopf|nGtv|ngtr|vopf|boxh|boxH|boxv|nges|ngeq|boxV|bscr|scap|Bscr|bsim|Vert|vert|bsol|bull|bump|caps|cdot|ncup|scnE|ncap|nbsp|napE|Cdot|cent|sdot|Vbar|nang|vBar|chcy|Mscr|mscr|sect|semi|CHcy|Mopf|mopf|sext|circ|cire|mldr|mlcp|cirE|comp|shcy|SHcy|vArr|varr|cong|copf|Copf|copy|COPY|malt|male|macr|lvnE|cscr|ltri|sime|ltcc|simg|Cscr|siml|csub|Uuml|lsqb|lsim|uuml|csup|Lscr|lscr|utri|smid|lpar|cups|smte|lozf|darr|Lopf|Uscr|solb|lopf|sopf|Sopf|lneq|uscr|spar|dArr|lnap|Darr|dash|Sqrt|LJcy|ljcy|lHar|dHar|Upsi|upsi|diam|lesg|djcy|DJcy|leqq|dopf|Dopf|dscr|Dscr|dscy|ldsh|ldca|squf|DScy|sscr|Sscr|dsol|lcub|late|star|Star|Uopf|Larr|lArr|larr|uopf|dtri|dzcy|sube|subE|Lang|lang|Kscr|kscr|Kopf|kopf|KJcy|kjcy|KHcy|khcy|DZcy|ecir|edot|eDot|Jscr|jscr|succ|Jopf|jopf|Edot|uHar|emsp|ensp|Iuml|iuml|eopf|isin|Iscr|iscr|Eopf|epar|sung|epsi|escr|sup1|sup2|sup3|Iota|iota|supe|supE|Iopf|iopf|IOcy|iocy|Escr|esim|Esim|imof|Uarr|QUOT|uArr|uarr|euml|IEcy|iecy|Idot|Euml|euro|excl|Hscr|hscr|Hopf|hopf|TScy|tscy|Tscr|hbar|tscr|flat|tbrk|fnof|hArr|harr|half|fopf|Fopf|tdot|gvnE|fork|trie|gtcc|fscr|Fscr|gdot|gsim|Gscr|gscr|Gopf|gopf|gneq|Gdot|tosa|gnap|Topf|topf|geqq|toea|GJcy|gjcy|tint|gesl|mid|Sfr|ggg|top|ges|gla|glE|glj|geq|gne|gEl|gel|gnE|Gcy|gcy|gap|Tfr|tfr|Tcy|tcy|Hat|Tau|Ffr|tau|Tab|hfr|Hfr|ffr|Fcy|fcy|icy|Icy|iff|ETH|eth|ifr|Ifr|Eta|eta|int|Int|Sup|sup|ucy|Ucy|Sum|sum|jcy|ENG|ufr|Ufr|eng|Jcy|jfr|els|ell|egs|Efr|efr|Jfr|uml|kcy|Kcy|Ecy|ecy|kfr|Kfr|lap|Sub|sub|lat|lcy|Lcy|leg|Dot|dot|lEg|leq|les|squ|div|die|lfr|Lfr|lgE|Dfr|dfr|Del|deg|Dcy|dcy|lne|lnE|sol|loz|smt|Cup|lrm|cup|lsh|Lsh|sim|shy|map|Map|mcy|Mcy|mfr|Mfr|mho|gfr|Gfr|sfr|cir|Chi|chi|nap|Cfr|vcy|Vcy|cfr|Scy|scy|ncy|Ncy|vee|Vee|Cap|cap|nfr|scE|sce|Nfr|nge|ngE|nGg|vfr|Vfr|ngt|bot|nGt|nis|niv|Rsh|rsh|nle|nlE|bne|Bfr|bfr|nLl|nlt|nLt|Bcy|bcy|not|Not|rlm|wfr|Wfr|npr|nsc|num|ocy|ast|Ocy|ofr|xfr|Xfr|Ofr|ogt|ohm|apE|olt|Rho|ape|rho|Rfr|rfr|ord|REG|ang|reg|orv|And|and|AMP|Rcy|amp|Afr|ycy|Ycy|yen|yfr|Yfr|rcy|par|pcy|Pcy|pfr|Pfr|phi|Phi|afr|Acy|acy|zcy|Zcy|piv|acE|acd|zfr|Zfr|pre|prE|psi|Psi|qfr|Qfr|zwj|Or|ge|Gg|gt|gg|el|oS|lt|Lt|LT|Re|lg|gl|eg|ne|Im|it|le|DD|wp|wr|nu|Nu|dd|lE|Sc|sc|pi|Pi|ee|af|ll|Ll|rx|gE|xi|pm|Xi|ic|pr|Pr|in|ni|mp|mu|ac|Mu|or|ap|Gt|GT|ii);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)(?!;)([=a-zA-Z0-9]?)|&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+)/g,
        f = {
          aacute: "á",
          Aacute: "Á",
          abreve: "ă",
          Abreve: "Ă",
          ac: "∾",
          acd: "∿",
          acE: "∾̳",
          acirc: "â",
          Acirc: "Â",
          acute: "´",
          acy: "а",
          Acy: "А",
          aelig: "æ",
          AElig: "Æ",
          af: "⁡",
          afr: "𝔞",
          Afr: "𝔄",
          agrave: "à",
          Agrave: "À",
          alefsym: "ℵ",
          aleph: "ℵ",
          alpha: "α",
          Alpha: "Α",
          amacr: "ā",
          Amacr: "Ā",
          amalg: "⨿",
          amp: "&",
          AMP: "&",
          and: "∧",
          And: "⩓",
          andand: "⩕",
          andd: "⩜",
          andslope: "⩘",
          andv: "⩚",
          ang: "∠",
          ange: "⦤",
          angle: "∠",
          angmsd: "∡",
          angmsdaa: "⦨",
          angmsdab: "⦩",
          angmsdac: "⦪",
          angmsdad: "⦫",
          angmsdae: "⦬",
          angmsdaf: "⦭",
          angmsdag: "⦮",
          angmsdah: "⦯",
          angrt: "∟",
          angrtvb: "⊾",
          angrtvbd: "⦝",
          angsph: "∢",
          angst: "Å",
          angzarr: "⍼",
          aogon: "ą",
          Aogon: "Ą",
          aopf: "𝕒",
          Aopf: "𝔸",
          ap: "≈",
          apacir: "⩯",
          ape: "≊",
          apE: "⩰",
          apid: "≋",
          apos: "'",
          ApplyFunction: "⁡",
          approx: "≈",
          approxeq: "≊",
          aring: "å",
          Aring: "Å",
          ascr: "𝒶",
          Ascr: "𝒜",
          Assign: "≔",
          ast: "*",
          asymp: "≈",
          asympeq: "≍",
          atilde: "ã",
          Atilde: "Ã",
          auml: "ä",
          Auml: "Ä",
          awconint: "∳",
          awint: "⨑",
          backcong: "≌",
          backepsilon: "϶",
          backprime: "‵",
          backsim: "∽",
          backsimeq: "⋍",
          Backslash: "∖",
          Barv: "⫧",
          barvee: "⊽",
          barwed: "⌅",
          Barwed: "⌆",
          barwedge: "⌅",
          bbrk: "⎵",
          bbrktbrk: "⎶",
          bcong: "≌",
          bcy: "б",
          Bcy: "Б",
          bdquo: "„",
          becaus: "∵",
          because: "∵",
          Because: "∵",
          bemptyv: "⦰",
          bepsi: "϶",
          bernou: "ℬ",
          Bernoullis: "ℬ",
          beta: "β",
          Beta: "Β",
          beth: "ℶ",
          between: "≬",
          bfr: "𝔟",
          Bfr: "𝔅",
          bigcap: "⋂",
          bigcirc: "◯",
          bigcup: "⋃",
          bigodot: "⨀",
          bigoplus: "⨁",
          bigotimes: "⨂",
          bigsqcup: "⨆",
          bigstar: "★",
          bigtriangledown: "▽",
          bigtriangleup: "△",
          biguplus: "⨄",
          bigvee: "⋁",
          bigwedge: "⋀",
          bkarow: "⤍",
          blacklozenge: "⧫",
          blacksquare: "▪",
          blacktriangle: "▴",
          blacktriangledown: "▾",
          blacktriangleleft: "◂",
          blacktriangleright: "▸",
          blank: "␣",
          blk12: "▒",
          blk14: "░",
          blk34: "▓",
          block: "█",
          bne: "=⃥",
          bnequiv: "≡⃥",
          bnot: "⌐",
          bNot: "⫭",
          bopf: "𝕓",
          Bopf: "𝔹",
          bot: "⊥",
          bottom: "⊥",
          bowtie: "⋈",
          boxbox: "⧉",
          boxdl: "┐",
          boxdL: "╕",
          boxDl: "╖",
          boxDL: "╗",
          boxdr: "┌",
          boxdR: "╒",
          boxDr: "╓",
          boxDR: "╔",
          boxh: "─",
          boxH: "═",
          boxhd: "┬",
          boxhD: "╥",
          boxHd: "╤",
          boxHD: "╦",
          boxhu: "┴",
          boxhU: "╨",
          boxHu: "╧",
          boxHU: "╩",
          boxminus: "⊟",
          boxplus: "⊞",
          boxtimes: "⊠",
          boxul: "┘",
          boxuL: "╛",
          boxUl: "╜",
          boxUL: "╝",
          boxur: "└",
          boxuR: "╘",
          boxUr: "╙",
          boxUR: "╚",
          boxv: "│",
          boxV: "║",
          boxvh: "┼",
          boxvH: "╪",
          boxVh: "╫",
          boxVH: "╬",
          boxvl: "┤",
          boxvL: "╡",
          boxVl: "╢",
          boxVL: "╣",
          boxvr: "├",
          boxvR: "╞",
          boxVr: "╟",
          boxVR: "╠",
          bprime: "‵",
          breve: "˘",
          Breve: "˘",
          brvbar: "¦",
          bscr: "𝒷",
          Bscr: "ℬ",
          bsemi: "⁏",
          bsim: "∽",
          bsime: "⋍",
          bsol: "\\",
          bsolb: "⧅",
          bsolhsub: "⟈",
          bull: "•",
          bullet: "•",
          bump: "≎",
          bumpe: "≏",
          bumpE: "⪮",
          bumpeq: "≏",
          Bumpeq: "≎",
          cacute: "ć",
          Cacute: "Ć",
          cap: "∩",
          Cap: "⋒",
          capand: "⩄",
          capbrcup: "⩉",
          capcap: "⩋",
          capcup: "⩇",
          capdot: "⩀",
          CapitalDifferentialD: "ⅅ",
          caps: "∩︀",
          caret: "⁁",
          caron: "ˇ",
          Cayleys: "ℭ",
          ccaps: "⩍",
          ccaron: "č",
          Ccaron: "Č",
          ccedil: "ç",
          Ccedil: "Ç",
          ccirc: "ĉ",
          Ccirc: "Ĉ",
          Cconint: "∰",
          ccups: "⩌",
          ccupssm: "⩐",
          cdot: "ċ",
          Cdot: "Ċ",
          cedil: "¸",
          Cedilla: "¸",
          cemptyv: "⦲",
          cent: "¢",
          centerdot: "·",
          CenterDot: "·",
          cfr: "𝔠",
          Cfr: "ℭ",
          chcy: "ч",
          CHcy: "Ч",
          check: "✓",
          checkmark: "✓",
          chi: "χ",
          Chi: "Χ",
          cir: "○",
          circ: "ˆ",
          circeq: "≗",
          circlearrowleft: "↺",
          circlearrowright: "↻",
          circledast: "⊛",
          circledcirc: "⊚",
          circleddash: "⊝",
          CircleDot: "⊙",
          circledR: "®",
          circledS: "Ⓢ",
          CircleMinus: "⊖",
          CirclePlus: "⊕",
          CircleTimes: "⊗",
          cire: "≗",
          cirE: "⧃",
          cirfnint: "⨐",
          cirmid: "⫯",
          cirscir: "⧂",
          ClockwiseContourIntegral: "∲",
          CloseCurlyDoubleQuote: "”",
          CloseCurlyQuote: "’",
          clubs: "♣",
          clubsuit: "♣",
          colon: ":",
          Colon: "∷",
          colone: "≔",
          Colone: "⩴",
          coloneq: "≔",
          comma: ",",
          commat: "@",
          comp: "∁",
          compfn: "∘",
          complement: "∁",
          complexes: "ℂ",
          cong: "≅",
          congdot: "⩭",
          Congruent: "≡",
          conint: "∮",
          Conint: "∯",
          ContourIntegral: "∮",
          copf: "𝕔",
          Copf: "ℂ",
          coprod: "∐",
          Coproduct: "∐",
          copy: "©",
          COPY: "©",
          copysr: "℗",
          CounterClockwiseContourIntegral: "∳",
          crarr: "↵",
          cross: "✗",
          Cross: "⨯",
          cscr: "𝒸",
          Cscr: "𝒞",
          csub: "⫏",
          csube: "⫑",
          csup: "⫐",
          csupe: "⫒",
          ctdot: "⋯",
          cudarrl: "⤸",
          cudarrr: "⤵",
          cuepr: "⋞",
          cuesc: "⋟",
          cularr: "↶",
          cularrp: "⤽",
          cup: "∪",
          Cup: "⋓",
          cupbrcap: "⩈",
          cupcap: "⩆",
          CupCap: "≍",
          cupcup: "⩊",
          cupdot: "⊍",
          cupor: "⩅",
          cups: "∪︀",
          curarr: "↷",
          curarrm: "⤼",
          curlyeqprec: "⋞",
          curlyeqsucc: "⋟",
          curlyvee: "⋎",
          curlywedge: "⋏",
          curren: "¤",
          curvearrowleft: "↶",
          curvearrowright: "↷",
          cuvee: "⋎",
          cuwed: "⋏",
          cwconint: "∲",
          cwint: "∱",
          cylcty: "⌭",
          dagger: "†",
          Dagger: "‡",
          daleth: "ℸ",
          darr: "↓",
          dArr: "⇓",
          Darr: "↡",
          dash: "‐",
          dashv: "⊣",
          Dashv: "⫤",
          dbkarow: "⤏",
          dblac: "˝",
          dcaron: "ď",
          Dcaron: "Ď",
          dcy: "д",
          Dcy: "Д",
          dd: "ⅆ",
          DD: "ⅅ",
          ddagger: "‡",
          ddarr: "⇊",
          DDotrahd: "⤑",
          ddotseq: "⩷",
          deg: "°",
          Del: "∇",
          delta: "δ",
          Delta: "Δ",
          demptyv: "⦱",
          dfisht: "⥿",
          dfr: "𝔡",
          Dfr: "𝔇",
          dHar: "⥥",
          dharl: "⇃",
          dharr: "⇂",
          DiacriticalAcute: "´",
          DiacriticalDot: "˙",
          DiacriticalDoubleAcute: "˝",
          DiacriticalGrave: "`",
          DiacriticalTilde: "˜",
          diam: "⋄",
          diamond: "⋄",
          Diamond: "⋄",
          diamondsuit: "♦",
          diams: "♦",
          die: "¨",
          DifferentialD: "ⅆ",
          digamma: "ϝ",
          disin: "⋲",
          div: "÷",
          divide: "÷",
          divideontimes: "⋇",
          divonx: "⋇",
          djcy: "ђ",
          DJcy: "Ђ",
          dlcorn: "⌞",
          dlcrop: "⌍",
          dollar: "$",
          dopf: "𝕕",
          Dopf: "𝔻",
          dot: "˙",
          Dot: "¨",
          DotDot: "⃜",
          doteq: "≐",
          doteqdot: "≑",
          DotEqual: "≐",
          dotminus: "∸",
          dotplus: "∔",
          dotsquare: "⊡",
          doublebarwedge: "⌆",
          DoubleContourIntegral: "∯",
          DoubleDot: "¨",
          DoubleDownArrow: "⇓",
          DoubleLeftArrow: "⇐",
          DoubleLeftRightArrow: "⇔",
          DoubleLeftTee: "⫤",
          DoubleLongLeftArrow: "⟸",
          DoubleLongLeftRightArrow: "⟺",
          DoubleLongRightArrow: "⟹",
          DoubleRightArrow: "⇒",
          DoubleRightTee: "⊨",
          DoubleUpArrow: "⇑",
          DoubleUpDownArrow: "⇕",
          DoubleVerticalBar: "∥",
          downarrow: "↓",
          Downarrow: "⇓",
          DownArrow: "↓",
          DownArrowBar: "⤓",
          DownArrowUpArrow: "⇵",
          DownBreve: "̑",
          downdownarrows: "⇊",
          downharpoonleft: "⇃",
          downharpoonright: "⇂",
          DownLeftRightVector: "⥐",
          DownLeftTeeVector: "⥞",
          DownLeftVector: "↽",
          DownLeftVectorBar: "⥖",
          DownRightTeeVector: "⥟",
          DownRightVector: "⇁",
          DownRightVectorBar: "⥗",
          DownTee: "⊤",
          DownTeeArrow: "↧",
          drbkarow: "⤐",
          drcorn: "⌟",
          drcrop: "⌌",
          dscr: "𝒹",
          Dscr: "𝒟",
          dscy: "ѕ",
          DScy: "Ѕ",
          dsol: "⧶",
          dstrok: "đ",
          Dstrok: "Đ",
          dtdot: "⋱",
          dtri: "▿",
          dtrif: "▾",
          duarr: "⇵",
          duhar: "⥯",
          dwangle: "⦦",
          dzcy: "џ",
          DZcy: "Џ",
          dzigrarr: "⟿",
          eacute: "é",
          Eacute: "É",
          easter: "⩮",
          ecaron: "ě",
          Ecaron: "Ě",
          ecir: "≖",
          ecirc: "ê",
          Ecirc: "Ê",
          ecolon: "≕",
          ecy: "э",
          Ecy: "Э",
          eDDot: "⩷",
          edot: "ė",
          eDot: "≑",
          Edot: "Ė",
          ee: "ⅇ",
          efDot: "≒",
          efr: "𝔢",
          Efr: "𝔈",
          eg: "⪚",
          egrave: "è",
          Egrave: "È",
          egs: "⪖",
          egsdot: "⪘",
          el: "⪙",
          Element: "∈",
          elinters: "⏧",
          ell: "ℓ",
          els: "⪕",
          elsdot: "⪗",
          emacr: "ē",
          Emacr: "Ē",
          empty: "∅",
          emptyset: "∅",
          EmptySmallSquare: "◻",
          emptyv: "∅",
          EmptyVerySmallSquare: "▫",
          emsp: " ",
          emsp13: " ",
          emsp14: " ",
          eng: "ŋ",
          ENG: "Ŋ",
          ensp: " ",
          eogon: "ę",
          Eogon: "Ę",
          eopf: "𝕖",
          Eopf: "𝔼",
          epar: "⋕",
          eparsl: "⧣",
          eplus: "⩱",
          epsi: "ε",
          epsilon: "ε",
          Epsilon: "Ε",
          epsiv: "ϵ",
          eqcirc: "≖",
          eqcolon: "≕",
          eqsim: "≂",
          eqslantgtr: "⪖",
          eqslantless: "⪕",
          Equal: "⩵",
          equals: "=",
          EqualTilde: "≂",
          equest: "≟",
          Equilibrium: "⇌",
          equiv: "≡",
          equivDD: "⩸",
          eqvparsl: "⧥",
          erarr: "⥱",
          erDot: "≓",
          escr: "ℯ",
          Escr: "ℰ",
          esdot: "≐",
          esim: "≂",
          Esim: "⩳",
          eta: "η",
          Eta: "Η",
          eth: "ð",
          ETH: "Ð",
          euml: "ë",
          Euml: "Ë",
          euro: "€",
          excl: "!",
          exist: "∃",
          Exists: "∃",
          expectation: "ℰ",
          exponentiale: "ⅇ",
          ExponentialE: "ⅇ",
          fallingdotseq: "≒",
          fcy: "ф",
          Fcy: "Ф",
          female: "♀",
          ffilig: "ﬃ",
          fflig: "ﬀ",
          ffllig: "ﬄ",
          ffr: "𝔣",
          Ffr: "𝔉",
          filig: "ﬁ",
          FilledSmallSquare: "◼",
          FilledVerySmallSquare: "▪",
          fjlig: "fj",
          flat: "♭",
          fllig: "ﬂ",
          fltns: "▱",
          fnof: "ƒ",
          fopf: "𝕗",
          Fopf: "𝔽",
          forall: "∀",
          ForAll: "∀",
          fork: "⋔",
          forkv: "⫙",
          Fouriertrf: "ℱ",
          fpartint: "⨍",
          frac12: "½",
          frac13: "⅓",
          frac14: "¼",
          frac15: "⅕",
          frac16: "⅙",
          frac18: "⅛",
          frac23: "⅔",
          frac25: "⅖",
          frac34: "¾",
          frac35: "⅗",
          frac38: "⅜",
          frac45: "⅘",
          frac56: "⅚",
          frac58: "⅝",
          frac78: "⅞",
          frasl: "⁄",
          frown: "⌢",
          fscr: "𝒻",
          Fscr: "ℱ",
          gacute: "ǵ",
          gamma: "γ",
          Gamma: "Γ",
          gammad: "ϝ",
          Gammad: "Ϝ",
          gap: "⪆",
          gbreve: "ğ",
          Gbreve: "Ğ",
          Gcedil: "Ģ",
          gcirc: "ĝ",
          Gcirc: "Ĝ",
          gcy: "г",
          Gcy: "Г",
          gdot: "ġ",
          Gdot: "Ġ",
          ge: "≥",
          gE: "≧",
          gel: "⋛",
          gEl: "⪌",
          geq: "≥",
          geqq: "≧",
          geqslant: "⩾",
          ges: "⩾",
          gescc: "⪩",
          gesdot: "⪀",
          gesdoto: "⪂",
          gesdotol: "⪄",
          gesl: "⋛︀",
          gesles: "⪔",
          gfr: "𝔤",
          Gfr: "𝔊",
          gg: "≫",
          Gg: "⋙",
          ggg: "⋙",
          gimel: "ℷ",
          gjcy: "ѓ",
          GJcy: "Ѓ",
          gl: "≷",
          gla: "⪥",
          glE: "⪒",
          glj: "⪤",
          gnap: "⪊",
          gnapprox: "⪊",
          gne: "⪈",
          gnE: "≩",
          gneq: "⪈",
          gneqq: "≩",
          gnsim: "⋧",
          gopf: "𝕘",
          Gopf: "𝔾",
          grave: "`",
          GreaterEqual: "≥",
          GreaterEqualLess: "⋛",
          GreaterFullEqual: "≧",
          GreaterGreater: "⪢",
          GreaterLess: "≷",
          GreaterSlantEqual: "⩾",
          GreaterTilde: "≳",
          gscr: "ℊ",
          Gscr: "𝒢",
          gsim: "≳",
          gsime: "⪎",
          gsiml: "⪐",
          gt: ">",
          Gt: "≫",
          GT: ">",
          gtcc: "⪧",
          gtcir: "⩺",
          gtdot: "⋗",
          gtlPar: "⦕",
          gtquest: "⩼",
          gtrapprox: "⪆",
          gtrarr: "⥸",
          gtrdot: "⋗",
          gtreqless: "⋛",
          gtreqqless: "⪌",
          gtrless: "≷",
          gtrsim: "≳",
          gvertneqq: "≩︀",
          gvnE: "≩︀",
          Hacek: "ˇ",
          hairsp: " ",
          half: "½",
          hamilt: "ℋ",
          hardcy: "ъ",
          HARDcy: "Ъ",
          harr: "↔",
          hArr: "⇔",
          harrcir: "⥈",
          harrw: "↭",
          Hat: "^",
          hbar: "ℏ",
          hcirc: "ĥ",
          Hcirc: "Ĥ",
          hearts: "♥",
          heartsuit: "♥",
          hellip: "…",
          hercon: "⊹",
          hfr: "𝔥",
          Hfr: "ℌ",
          HilbertSpace: "ℋ",
          hksearow: "⤥",
          hkswarow: "⤦",
          hoarr: "⇿",
          homtht: "∻",
          hookleftarrow: "↩",
          hookrightarrow: "↪",
          hopf: "𝕙",
          Hopf: "ℍ",
          horbar: "―",
          HorizontalLine: "─",
          hscr: "𝒽",
          Hscr: "ℋ",
          hslash: "ℏ",
          hstrok: "ħ",
          Hstrok: "Ħ",
          HumpDownHump: "≎",
          HumpEqual: "≏",
          hybull: "⁃",
          hyphen: "‐",
          iacute: "í",
          Iacute: "Í",
          ic: "⁣",
          icirc: "î",
          Icirc: "Î",
          icy: "и",
          Icy: "И",
          Idot: "İ",
          iecy: "е",
          IEcy: "Е",
          iexcl: "¡",
          iff: "⇔",
          ifr: "𝔦",
          Ifr: "ℑ",
          igrave: "ì",
          Igrave: "Ì",
          ii: "ⅈ",
          iiiint: "⨌",
          iiint: "∭",
          iinfin: "⧜",
          iiota: "℩",
          ijlig: "ĳ",
          IJlig: "Ĳ",
          Im: "ℑ",
          imacr: "ī",
          Imacr: "Ī",
          image: "ℑ",
          ImaginaryI: "ⅈ",
          imagline: "ℐ",
          imagpart: "ℑ",
          imath: "ı",
          imof: "⊷",
          imped: "Ƶ",
          Implies: "⇒",
          in: "∈",
          incare: "℅",
          infin: "∞",
          infintie: "⧝",
          inodot: "ı",
          int: "∫",
          Int: "∬",
          intcal: "⊺",
          integers: "ℤ",
          Integral: "∫",
          intercal: "⊺",
          Intersection: "⋂",
          intlarhk: "⨗",
          intprod: "⨼",
          InvisibleComma: "⁣",
          InvisibleTimes: "⁢",
          iocy: "ё",
          IOcy: "Ё",
          iogon: "į",
          Iogon: "Į",
          iopf: "𝕚",
          Iopf: "𝕀",
          iota: "ι",
          Iota: "Ι",
          iprod: "⨼",
          iquest: "¿",
          iscr: "𝒾",
          Iscr: "ℐ",
          isin: "∈",
          isindot: "⋵",
          isinE: "⋹",
          isins: "⋴",
          isinsv: "⋳",
          isinv: "∈",
          it: "⁢",
          itilde: "ĩ",
          Itilde: "Ĩ",
          iukcy: "і",
          Iukcy: "І",
          iuml: "ï",
          Iuml: "Ï",
          jcirc: "ĵ",
          Jcirc: "Ĵ",
          jcy: "й",
          Jcy: "Й",
          jfr: "𝔧",
          Jfr: "𝔍",
          jmath: "ȷ",
          jopf: "𝕛",
          Jopf: "𝕁",
          jscr: "𝒿",
          Jscr: "𝒥",
          jsercy: "ј",
          Jsercy: "Ј",
          jukcy: "є",
          Jukcy: "Є",
          kappa: "κ",
          Kappa: "Κ",
          kappav: "ϰ",
          kcedil: "ķ",
          Kcedil: "Ķ",
          kcy: "к",
          Kcy: "К",
          kfr: "𝔨",
          Kfr: "𝔎",
          kgreen: "ĸ",
          khcy: "х",
          KHcy: "Х",
          kjcy: "ќ",
          KJcy: "Ќ",
          kopf: "𝕜",
          Kopf: "𝕂",
          kscr: "𝓀",
          Kscr: "𝒦",
          lAarr: "⇚",
          lacute: "ĺ",
          Lacute: "Ĺ",
          laemptyv: "⦴",
          lagran: "ℒ",
          lambda: "λ",
          Lambda: "Λ",
          lang: "⟨",
          Lang: "⟪",
          langd: "⦑",
          langle: "⟨",
          lap: "⪅",
          Laplacetrf: "ℒ",
          laquo: "«",
          larr: "←",
          lArr: "⇐",
          Larr: "↞",
          larrb: "⇤",
          larrbfs: "⤟",
          larrfs: "⤝",
          larrhk: "↩",
          larrlp: "↫",
          larrpl: "⤹",
          larrsim: "⥳",
          larrtl: "↢",
          lat: "⪫",
          latail: "⤙",
          lAtail: "⤛",
          late: "⪭",
          lates: "⪭︀",
          lbarr: "⤌",
          lBarr: "⤎",
          lbbrk: "❲",
          lbrace: "{",
          lbrack: "[",
          lbrke: "⦋",
          lbrksld: "⦏",
          lbrkslu: "⦍",
          lcaron: "ľ",
          Lcaron: "Ľ",
          lcedil: "ļ",
          Lcedil: "Ļ",
          lceil: "⌈",
          lcub: "{",
          lcy: "л",
          Lcy: "Л",
          ldca: "⤶",
          ldquo: "“",
          ldquor: "„",
          ldrdhar: "⥧",
          ldrushar: "⥋",
          ldsh: "↲",
          le: "≤",
          lE: "≦",
          LeftAngleBracket: "⟨",
          leftarrow: "←",
          Leftarrow: "⇐",
          LeftArrow: "←",
          LeftArrowBar: "⇤",
          LeftArrowRightArrow: "⇆",
          leftarrowtail: "↢",
          LeftCeiling: "⌈",
          LeftDoubleBracket: "⟦",
          LeftDownTeeVector: "⥡",
          LeftDownVector: "⇃",
          LeftDownVectorBar: "⥙",
          LeftFloor: "⌊",
          leftharpoondown: "↽",
          leftharpoonup: "↼",
          leftleftarrows: "⇇",
          leftrightarrow: "↔",
          Leftrightarrow: "⇔",
          LeftRightArrow: "↔",
          leftrightarrows: "⇆",
          leftrightharpoons: "⇋",
          leftrightsquigarrow: "↭",
          LeftRightVector: "⥎",
          LeftTee: "⊣",
          LeftTeeArrow: "↤",
          LeftTeeVector: "⥚",
          leftthreetimes: "⋋",
          LeftTriangle: "⊲",
          LeftTriangleBar: "⧏",
          LeftTriangleEqual: "⊴",
          LeftUpDownVector: "⥑",
          LeftUpTeeVector: "⥠",
          LeftUpVector: "↿",
          LeftUpVectorBar: "⥘",
          LeftVector: "↼",
          LeftVectorBar: "⥒",
          leg: "⋚",
          lEg: "⪋",
          leq: "≤",
          leqq: "≦",
          leqslant: "⩽",
          les: "⩽",
          lescc: "⪨",
          lesdot: "⩿",
          lesdoto: "⪁",
          lesdotor: "⪃",
          lesg: "⋚︀",
          lesges: "⪓",
          lessapprox: "⪅",
          lessdot: "⋖",
          lesseqgtr: "⋚",
          lesseqqgtr: "⪋",
          LessEqualGreater: "⋚",
          LessFullEqual: "≦",
          LessGreater: "≶",
          lessgtr: "≶",
          LessLess: "⪡",
          lesssim: "≲",
          LessSlantEqual: "⩽",
          LessTilde: "≲",
          lfisht: "⥼",
          lfloor: "⌊",
          lfr: "𝔩",
          Lfr: "𝔏",
          lg: "≶",
          lgE: "⪑",
          lHar: "⥢",
          lhard: "↽",
          lharu: "↼",
          lharul: "⥪",
          lhblk: "▄",
          ljcy: "љ",
          LJcy: "Љ",
          ll: "≪",
          Ll: "⋘",
          llarr: "⇇",
          llcorner: "⌞",
          Lleftarrow: "⇚",
          llhard: "⥫",
          lltri: "◺",
          lmidot: "ŀ",
          Lmidot: "Ŀ",
          lmoust: "⎰",
          lmoustache: "⎰",
          lnap: "⪉",
          lnapprox: "⪉",
          lne: "⪇",
          lnE: "≨",
          lneq: "⪇",
          lneqq: "≨",
          lnsim: "⋦",
          loang: "⟬",
          loarr: "⇽",
          lobrk: "⟦",
          longleftarrow: "⟵",
          Longleftarrow: "⟸",
          LongLeftArrow: "⟵",
          longleftrightarrow: "⟷",
          Longleftrightarrow: "⟺",
          LongLeftRightArrow: "⟷",
          longmapsto: "⟼",
          longrightarrow: "⟶",
          Longrightarrow: "⟹",
          LongRightArrow: "⟶",
          looparrowleft: "↫",
          looparrowright: "↬",
          lopar: "⦅",
          lopf: "𝕝",
          Lopf: "𝕃",
          loplus: "⨭",
          lotimes: "⨴",
          lowast: "∗",
          lowbar: "_",
          LowerLeftArrow: "↙",
          LowerRightArrow: "↘",
          loz: "◊",
          lozenge: "◊",
          lozf: "⧫",
          lpar: "(",
          lparlt: "⦓",
          lrarr: "⇆",
          lrcorner: "⌟",
          lrhar: "⇋",
          lrhard: "⥭",
          lrm: "‎",
          lrtri: "⊿",
          lsaquo: "‹",
          lscr: "𝓁",
          Lscr: "ℒ",
          lsh: "↰",
          Lsh: "↰",
          lsim: "≲",
          lsime: "⪍",
          lsimg: "⪏",
          lsqb: "[",
          lsquo: "‘",
          lsquor: "‚",
          lstrok: "ł",
          Lstrok: "Ł",
          lt: "<",
          Lt: "≪",
          LT: "<",
          ltcc: "⪦",
          ltcir: "⩹",
          ltdot: "⋖",
          lthree: "⋋",
          ltimes: "⋉",
          ltlarr: "⥶",
          ltquest: "⩻",
          ltri: "◃",
          ltrie: "⊴",
          ltrif: "◂",
          ltrPar: "⦖",
          lurdshar: "⥊",
          luruhar: "⥦",
          lvertneqq: "≨︀",
          lvnE: "≨︀",
          macr: "¯",
          male: "♂",
          malt: "✠",
          maltese: "✠",
          map: "↦",
          Map: "⤅",
          mapsto: "↦",
          mapstodown: "↧",
          mapstoleft: "↤",
          mapstoup: "↥",
          marker: "▮",
          mcomma: "⨩",
          mcy: "м",
          Mcy: "М",
          mdash: "—",
          mDDot: "∺",
          measuredangle: "∡",
          MediumSpace: " ",
          Mellintrf: "ℳ",
          mfr: "𝔪",
          Mfr: "𝔐",
          mho: "℧",
          micro: "µ",
          mid: "∣",
          midast: "*",
          midcir: "⫰",
          middot: "·",
          minus: "−",
          minusb: "⊟",
          minusd: "∸",
          minusdu: "⨪",
          MinusPlus: "∓",
          mlcp: "⫛",
          mldr: "…",
          mnplus: "∓",
          models: "⊧",
          mopf: "𝕞",
          Mopf: "𝕄",
          mp: "∓",
          mscr: "𝓂",
          Mscr: "ℳ",
          mstpos: "∾",
          mu: "μ",
          Mu: "Μ",
          multimap: "⊸",
          mumap: "⊸",
          nabla: "∇",
          nacute: "ń",
          Nacute: "Ń",
          nang: "∠⃒",
          nap: "≉",
          napE: "⩰̸",
          napid: "≋̸",
          napos: "ŉ",
          napprox: "≉",
          natur: "♮",
          natural: "♮",
          naturals: "ℕ",
          nbsp: " ",
          nbump: "≎̸",
          nbumpe: "≏̸",
          ncap: "⩃",
          ncaron: "ň",
          Ncaron: "Ň",
          ncedil: "ņ",
          Ncedil: "Ņ",
          ncong: "≇",
          ncongdot: "⩭̸",
          ncup: "⩂",
          ncy: "н",
          Ncy: "Н",
          ndash: "–",
          ne: "≠",
          nearhk: "⤤",
          nearr: "↗",
          neArr: "⇗",
          nearrow: "↗",
          nedot: "≐̸",
          NegativeMediumSpace: "​",
          NegativeThickSpace: "​",
          NegativeThinSpace: "​",
          NegativeVeryThinSpace: "​",
          nequiv: "≢",
          nesear: "⤨",
          nesim: "≂̸",
          NestedGreaterGreater: "≫",
          NestedLessLess: "≪",
          NewLine: "\n",
          nexist: "∄",
          nexists: "∄",
          nfr: "𝔫",
          Nfr: "𝔑",
          nge: "≱",
          ngE: "≧̸",
          ngeq: "≱",
          ngeqq: "≧̸",
          ngeqslant: "⩾̸",
          nges: "⩾̸",
          nGg: "⋙̸",
          ngsim: "≵",
          ngt: "≯",
          nGt: "≫⃒",
          ngtr: "≯",
          nGtv: "≫̸",
          nharr: "↮",
          nhArr: "⇎",
          nhpar: "⫲",
          ni: "∋",
          nis: "⋼",
          nisd: "⋺",
          niv: "∋",
          njcy: "њ",
          NJcy: "Њ",
          nlarr: "↚",
          nlArr: "⇍",
          nldr: "‥",
          nle: "≰",
          nlE: "≦̸",
          nleftarrow: "↚",
          nLeftarrow: "⇍",
          nleftrightarrow: "↮",
          nLeftrightarrow: "⇎",
          nleq: "≰",
          nleqq: "≦̸",
          nleqslant: "⩽̸",
          nles: "⩽̸",
          nless: "≮",
          nLl: "⋘̸",
          nlsim: "≴",
          nlt: "≮",
          nLt: "≪⃒",
          nltri: "⋪",
          nltrie: "⋬",
          nLtv: "≪̸",
          nmid: "∤",
          NoBreak: "⁠",
          NonBreakingSpace: " ",
          nopf: "𝕟",
          Nopf: "ℕ",
          not: "¬",
          Not: "⫬",
          NotCongruent: "≢",
          NotCupCap: "≭",
          NotDoubleVerticalBar: "∦",
          NotElement: "∉",
          NotEqual: "≠",
          NotEqualTilde: "≂̸",
          NotExists: "∄",
          NotGreater: "≯",
          NotGreaterEqual: "≱",
          NotGreaterFullEqual: "≧̸",
          NotGreaterGreater: "≫̸",
          NotGreaterLess: "≹",
          NotGreaterSlantEqual: "⩾̸",
          NotGreaterTilde: "≵",
          NotHumpDownHump: "≎̸",
          NotHumpEqual: "≏̸",
          notin: "∉",
          notindot: "⋵̸",
          notinE: "⋹̸",
          notinva: "∉",
          notinvb: "⋷",
          notinvc: "⋶",
          NotLeftTriangle: "⋪",
          NotLeftTriangleBar: "⧏̸",
          NotLeftTriangleEqual: "⋬",
          NotLess: "≮",
          NotLessEqual: "≰",
          NotLessGreater: "≸",
          NotLessLess: "≪̸",
          NotLessSlantEqual: "⩽̸",
          NotLessTilde: "≴",
          NotNestedGreaterGreater: "⪢̸",
          NotNestedLessLess: "⪡̸",
          notni: "∌",
          notniva: "∌",
          notnivb: "⋾",
          notnivc: "⋽",
          NotPrecedes: "⊀",
          NotPrecedesEqual: "⪯̸",
          NotPrecedesSlantEqual: "⋠",
          NotReverseElement: "∌",
          NotRightTriangle: "⋫",
          NotRightTriangleBar: "⧐̸",
          NotRightTriangleEqual: "⋭",
          NotSquareSubset: "⊏̸",
          NotSquareSubsetEqual: "⋢",
          NotSquareSuperset: "⊐̸",
          NotSquareSupersetEqual: "⋣",
          NotSubset: "⊂⃒",
          NotSubsetEqual: "⊈",
          NotSucceeds: "⊁",
          NotSucceedsEqual: "⪰̸",
          NotSucceedsSlantEqual: "⋡",
          NotSucceedsTilde: "≿̸",
          NotSuperset: "⊃⃒",
          NotSupersetEqual: "⊉",
          NotTilde: "≁",
          NotTildeEqual: "≄",
          NotTildeFullEqual: "≇",
          NotTildeTilde: "≉",
          NotVerticalBar: "∤",
          npar: "∦",
          nparallel: "∦",
          nparsl: "⫽⃥",
          npart: "∂̸",
          npolint: "⨔",
          npr: "⊀",
          nprcue: "⋠",
          npre: "⪯̸",
          nprec: "⊀",
          npreceq: "⪯̸",
          nrarr: "↛",
          nrArr: "⇏",
          nrarrc: "⤳̸",
          nrarrw: "↝̸",
          nrightarrow: "↛",
          nRightarrow: "⇏",
          nrtri: "⋫",
          nrtrie: "⋭",
          nsc: "⊁",
          nsccue: "⋡",
          nsce: "⪰̸",
          nscr: "𝓃",
          Nscr: "𝒩",
          nshortmid: "∤",
          nshortparallel: "∦",
          nsim: "≁",
          nsime: "≄",
          nsimeq: "≄",
          nsmid: "∤",
          nspar: "∦",
          nsqsube: "⋢",
          nsqsupe: "⋣",
          nsub: "⊄",
          nsube: "⊈",
          nsubE: "⫅̸",
          nsubset: "⊂⃒",
          nsubseteq: "⊈",
          nsubseteqq: "⫅̸",
          nsucc: "⊁",
          nsucceq: "⪰̸",
          nsup: "⊅",
          nsupe: "⊉",
          nsupE: "⫆̸",
          nsupset: "⊃⃒",
          nsupseteq: "⊉",
          nsupseteqq: "⫆̸",
          ntgl: "≹",
          ntilde: "ñ",
          Ntilde: "Ñ",
          ntlg: "≸",
          ntriangleleft: "⋪",
          ntrianglelefteq: "⋬",
          ntriangleright: "⋫",
          ntrianglerighteq: "⋭",
          nu: "ν",
          Nu: "Ν",
          num: "#",
          numero: "№",
          numsp: " ",
          nvap: "≍⃒",
          nvdash: "⊬",
          nvDash: "⊭",
          nVdash: "⊮",
          nVDash: "⊯",
          nvge: "≥⃒",
          nvgt: ">⃒",
          nvHarr: "⤄",
          nvinfin: "⧞",
          nvlArr: "⤂",
          nvle: "≤⃒",
          nvlt: "<⃒",
          nvltrie: "⊴⃒",
          nvrArr: "⤃",
          nvrtrie: "⊵⃒",
          nvsim: "∼⃒",
          nwarhk: "⤣",
          nwarr: "↖",
          nwArr: "⇖",
          nwarrow: "↖",
          nwnear: "⤧",
          oacute: "ó",
          Oacute: "Ó",
          oast: "⊛",
          ocir: "⊚",
          ocirc: "ô",
          Ocirc: "Ô",
          ocy: "о",
          Ocy: "О",
          odash: "⊝",
          odblac: "ő",
          Odblac: "Ő",
          odiv: "⨸",
          odot: "⊙",
          odsold: "⦼",
          oelig: "œ",
          OElig: "Œ",
          ofcir: "⦿",
          ofr: "𝔬",
          Ofr: "𝔒",
          ogon: "˛",
          ograve: "ò",
          Ograve: "Ò",
          ogt: "⧁",
          ohbar: "⦵",
          ohm: "Ω",
          oint: "∮",
          olarr: "↺",
          olcir: "⦾",
          olcross: "⦻",
          oline: "‾",
          olt: "⧀",
          omacr: "ō",
          Omacr: "Ō",
          omega: "ω",
          Omega: "Ω",
          omicron: "ο",
          Omicron: "Ο",
          omid: "⦶",
          ominus: "⊖",
          oopf: "𝕠",
          Oopf: "𝕆",
          opar: "⦷",
          OpenCurlyDoubleQuote: "“",
          OpenCurlyQuote: "‘",
          operp: "⦹",
          oplus: "⊕",
          or: "∨",
          Or: "⩔",
          orarr: "↻",
          ord: "⩝",
          order: "ℴ",
          orderof: "ℴ",
          ordf: "ª",
          ordm: "º",
          origof: "⊶",
          oror: "⩖",
          orslope: "⩗",
          orv: "⩛",
          oS: "Ⓢ",
          oscr: "ℴ",
          Oscr: "𝒪",
          oslash: "ø",
          Oslash: "Ø",
          osol: "⊘",
          otilde: "õ",
          Otilde: "Õ",
          otimes: "⊗",
          Otimes: "⨷",
          otimesas: "⨶",
          ouml: "ö",
          Ouml: "Ö",
          ovbar: "⌽",
          OverBar: "‾",
          OverBrace: "⏞",
          OverBracket: "⎴",
          OverParenthesis: "⏜",
          par: "∥",
          para: "¶",
          parallel: "∥",
          parsim: "⫳",
          parsl: "⫽",
          part: "∂",
          PartialD: "∂",
          pcy: "п",
          Pcy: "П",
          percnt: "%",
          period: ".",
          permil: "‰",
          perp: "⊥",
          pertenk: "‱",
          pfr: "𝔭",
          Pfr: "𝔓",
          phi: "φ",
          Phi: "Φ",
          phiv: "ϕ",
          phmmat: "ℳ",
          phone: "☎",
          pi: "π",
          Pi: "Π",
          pitchfork: "⋔",
          piv: "ϖ",
          planck: "ℏ",
          planckh: "ℎ",
          plankv: "ℏ",
          plus: "+",
          plusacir: "⨣",
          plusb: "⊞",
          pluscir: "⨢",
          plusdo: "∔",
          plusdu: "⨥",
          pluse: "⩲",
          PlusMinus: "±",
          plusmn: "±",
          plussim: "⨦",
          plustwo: "⨧",
          pm: "±",
          Poincareplane: "ℌ",
          pointint: "⨕",
          popf: "𝕡",
          Popf: "ℙ",
          pound: "£",
          pr: "≺",
          Pr: "⪻",
          prap: "⪷",
          prcue: "≼",
          pre: "⪯",
          prE: "⪳",
          prec: "≺",
          precapprox: "⪷",
          preccurlyeq: "≼",
          Precedes: "≺",
          PrecedesEqual: "⪯",
          PrecedesSlantEqual: "≼",
          PrecedesTilde: "≾",
          preceq: "⪯",
          precnapprox: "⪹",
          precneqq: "⪵",
          precnsim: "⋨",
          precsim: "≾",
          prime: "′",
          Prime: "″",
          primes: "ℙ",
          prnap: "⪹",
          prnE: "⪵",
          prnsim: "⋨",
          prod: "∏",
          Product: "∏",
          profalar: "⌮",
          profline: "⌒",
          profsurf: "⌓",
          prop: "∝",
          Proportion: "∷",
          Proportional: "∝",
          propto: "∝",
          prsim: "≾",
          prurel: "⊰",
          pscr: "𝓅",
          Pscr: "𝒫",
          psi: "ψ",
          Psi: "Ψ",
          puncsp: " ",
          qfr: "𝔮",
          Qfr: "𝔔",
          qint: "⨌",
          qopf: "𝕢",
          Qopf: "ℚ",
          qprime: "⁗",
          qscr: "𝓆",
          Qscr: "𝒬",
          quaternions: "ℍ",
          quatint: "⨖",
          quest: "?",
          questeq: "≟",
          quot: '"',
          QUOT: '"',
          rAarr: "⇛",
          race: "∽̱",
          racute: "ŕ",
          Racute: "Ŕ",
          radic: "√",
          raemptyv: "⦳",
          rang: "⟩",
          Rang: "⟫",
          rangd: "⦒",
          range: "⦥",
          rangle: "⟩",
          raquo: "»",
          rarr: "→",
          rArr: "⇒",
          Rarr: "↠",
          rarrap: "⥵",
          rarrb: "⇥",
          rarrbfs: "⤠",
          rarrc: "⤳",
          rarrfs: "⤞",
          rarrhk: "↪",
          rarrlp: "↬",
          rarrpl: "⥅",
          rarrsim: "⥴",
          rarrtl: "↣",
          Rarrtl: "⤖",
          rarrw: "↝",
          ratail: "⤚",
          rAtail: "⤜",
          ratio: "∶",
          rationals: "ℚ",
          rbarr: "⤍",
          rBarr: "⤏",
          RBarr: "⤐",
          rbbrk: "❳",
          rbrace: "}",
          rbrack: "]",
          rbrke: "⦌",
          rbrksld: "⦎",
          rbrkslu: "⦐",
          rcaron: "ř",
          Rcaron: "Ř",
          rcedil: "ŗ",
          Rcedil: "Ŗ",
          rceil: "⌉",
          rcub: "}",
          rcy: "р",
          Rcy: "Р",
          rdca: "⤷",
          rdldhar: "⥩",
          rdquo: "”",
          rdquor: "”",
          rdsh: "↳",
          Re: "ℜ",
          real: "ℜ",
          realine: "ℛ",
          realpart: "ℜ",
          reals: "ℝ",
          rect: "▭",
          reg: "®",
          REG: "®",
          ReverseElement: "∋",
          ReverseEquilibrium: "⇋",
          ReverseUpEquilibrium: "⥯",
          rfisht: "⥽",
          rfloor: "⌋",
          rfr: "𝔯",
          Rfr: "ℜ",
          rHar: "⥤",
          rhard: "⇁",
          rharu: "⇀",
          rharul: "⥬",
          rho: "ρ",
          Rho: "Ρ",
          rhov: "ϱ",
          RightAngleBracket: "⟩",
          rightarrow: "→",
          Rightarrow: "⇒",
          RightArrow: "→",
          RightArrowBar: "⇥",
          RightArrowLeftArrow: "⇄",
          rightarrowtail: "↣",
          RightCeiling: "⌉",
          RightDoubleBracket: "⟧",
          RightDownTeeVector: "⥝",
          RightDownVector: "⇂",
          RightDownVectorBar: "⥕",
          RightFloor: "⌋",
          rightharpoondown: "⇁",
          rightharpoonup: "⇀",
          rightleftarrows: "⇄",
          rightleftharpoons: "⇌",
          rightrightarrows: "⇉",
          rightsquigarrow: "↝",
          RightTee: "⊢",
          RightTeeArrow: "↦",
          RightTeeVector: "⥛",
          rightthreetimes: "⋌",
          RightTriangle: "⊳",
          RightTriangleBar: "⧐",
          RightTriangleEqual: "⊵",
          RightUpDownVector: "⥏",
          RightUpTeeVector: "⥜",
          RightUpVector: "↾",
          RightUpVectorBar: "⥔",
          RightVector: "⇀",
          RightVectorBar: "⥓",
          ring: "˚",
          risingdotseq: "≓",
          rlarr: "⇄",
          rlhar: "⇌",
          rlm: "‏",
          rmoust: "⎱",
          rmoustache: "⎱",
          rnmid: "⫮",
          roang: "⟭",
          roarr: "⇾",
          robrk: "⟧",
          ropar: "⦆",
          ropf: "𝕣",
          Ropf: "ℝ",
          roplus: "⨮",
          rotimes: "⨵",
          RoundImplies: "⥰",
          rpar: ")",
          rpargt: "⦔",
          rppolint: "⨒",
          rrarr: "⇉",
          Rrightarrow: "⇛",
          rsaquo: "›",
          rscr: "𝓇",
          Rscr: "ℛ",
          rsh: "↱",
          Rsh: "↱",
          rsqb: "]",
          rsquo: "’",
          rsquor: "’",
          rthree: "⋌",
          rtimes: "⋊",
          rtri: "▹",
          rtrie: "⊵",
          rtrif: "▸",
          rtriltri: "⧎",
          RuleDelayed: "⧴",
          ruluhar: "⥨",
          rx: "℞",
          sacute: "ś",
          Sacute: "Ś",
          sbquo: "‚",
          sc: "≻",
          Sc: "⪼",
          scap: "⪸",
          scaron: "š",
          Scaron: "Š",
          sccue: "≽",
          sce: "⪰",
          scE: "⪴",
          scedil: "ş",
          Scedil: "Ş",
          scirc: "ŝ",
          Scirc: "Ŝ",
          scnap: "⪺",
          scnE: "⪶",
          scnsim: "⋩",
          scpolint: "⨓",
          scsim: "≿",
          scy: "с",
          Scy: "С",
          sdot: "⋅",
          sdotb: "⊡",
          sdote: "⩦",
          searhk: "⤥",
          searr: "↘",
          seArr: "⇘",
          searrow: "↘",
          sect: "§",
          semi: ";",
          seswar: "⤩",
          setminus: "∖",
          setmn: "∖",
          sext: "✶",
          sfr: "𝔰",
          Sfr: "𝔖",
          sfrown: "⌢",
          sharp: "♯",
          shchcy: "щ",
          SHCHcy: "Щ",
          shcy: "ш",
          SHcy: "Ш",
          ShortDownArrow: "↓",
          ShortLeftArrow: "←",
          shortmid: "∣",
          shortparallel: "∥",
          ShortRightArrow: "→",
          ShortUpArrow: "↑",
          shy: "­",
          sigma: "σ",
          Sigma: "Σ",
          sigmaf: "ς",
          sigmav: "ς",
          sim: "∼",
          simdot: "⩪",
          sime: "≃",
          simeq: "≃",
          simg: "⪞",
          simgE: "⪠",
          siml: "⪝",
          simlE: "⪟",
          simne: "≆",
          simplus: "⨤",
          simrarr: "⥲",
          slarr: "←",
          SmallCircle: "∘",
          smallsetminus: "∖",
          smashp: "⨳",
          smeparsl: "⧤",
          smid: "∣",
          smile: "⌣",
          smt: "⪪",
          smte: "⪬",
          smtes: "⪬︀",
          softcy: "ь",
          SOFTcy: "Ь",
          sol: "/",
          solb: "⧄",
          solbar: "⌿",
          sopf: "𝕤",
          Sopf: "𝕊",
          spades: "♠",
          spadesuit: "♠",
          spar: "∥",
          sqcap: "⊓",
          sqcaps: "⊓︀",
          sqcup: "⊔",
          sqcups: "⊔︀",
          Sqrt: "√",
          sqsub: "⊏",
          sqsube: "⊑",
          sqsubset: "⊏",
          sqsubseteq: "⊑",
          sqsup: "⊐",
          sqsupe: "⊒",
          sqsupset: "⊐",
          sqsupseteq: "⊒",
          squ: "□",
          square: "□",
          Square: "□",
          SquareIntersection: "⊓",
          SquareSubset: "⊏",
          SquareSubsetEqual: "⊑",
          SquareSuperset: "⊐",
          SquareSupersetEqual: "⊒",
          SquareUnion: "⊔",
          squarf: "▪",
          squf: "▪",
          srarr: "→",
          sscr: "𝓈",
          Sscr: "𝒮",
          ssetmn: "∖",
          ssmile: "⌣",
          sstarf: "⋆",
          star: "☆",
          Star: "⋆",
          starf: "★",
          straightepsilon: "ϵ",
          straightphi: "ϕ",
          strns: "¯",
          sub: "⊂",
          Sub: "⋐",
          subdot: "⪽",
          sube: "⊆",
          subE: "⫅",
          subedot: "⫃",
          submult: "⫁",
          subne: "⊊",
          subnE: "⫋",
          subplus: "⪿",
          subrarr: "⥹",
          subset: "⊂",
          Subset: "⋐",
          subseteq: "⊆",
          subseteqq: "⫅",
          SubsetEqual: "⊆",
          subsetneq: "⊊",
          subsetneqq: "⫋",
          subsim: "⫇",
          subsub: "⫕",
          subsup: "⫓",
          succ: "≻",
          succapprox: "⪸",
          succcurlyeq: "≽",
          Succeeds: "≻",
          SucceedsEqual: "⪰",
          SucceedsSlantEqual: "≽",
          SucceedsTilde: "≿",
          succeq: "⪰",
          succnapprox: "⪺",
          succneqq: "⪶",
          succnsim: "⋩",
          succsim: "≿",
          SuchThat: "∋",
          sum: "∑",
          Sum: "∑",
          sung: "♪",
          sup: "⊃",
          Sup: "⋑",
          sup1: "¹",
          sup2: "²",
          sup3: "³",
          supdot: "⪾",
          supdsub: "⫘",
          supe: "⊇",
          supE: "⫆",
          supedot: "⫄",
          Superset: "⊃",
          SupersetEqual: "⊇",
          suphsol: "⟉",
          suphsub: "⫗",
          suplarr: "⥻",
          supmult: "⫂",
          supne: "⊋",
          supnE: "⫌",
          supplus: "⫀",
          supset: "⊃",
          Supset: "⋑",
          supseteq: "⊇",
          supseteqq: "⫆",
          supsetneq: "⊋",
          supsetneqq: "⫌",
          supsim: "⫈",
          supsub: "⫔",
          supsup: "⫖",
          swarhk: "⤦",
          swarr: "↙",
          swArr: "⇙",
          swarrow: "↙",
          swnwar: "⤪",
          szlig: "ß",
          Tab: "\t",
          target: "⌖",
          tau: "τ",
          Tau: "Τ",
          tbrk: "⎴",
          tcaron: "ť",
          Tcaron: "Ť",
          tcedil: "ţ",
          Tcedil: "Ţ",
          tcy: "т",
          Tcy: "Т",
          tdot: "⃛",
          telrec: "⌕",
          tfr: "𝔱",
          Tfr: "𝔗",
          there4: "∴",
          therefore: "∴",
          Therefore: "∴",
          theta: "θ",
          Theta: "Θ",
          thetasym: "ϑ",
          thetav: "ϑ",
          thickapprox: "≈",
          thicksim: "∼",
          ThickSpace: "  ",
          thinsp: " ",
          ThinSpace: " ",
          thkap: "≈",
          thksim: "∼",
          thorn: "þ",
          THORN: "Þ",
          tilde: "˜",
          Tilde: "∼",
          TildeEqual: "≃",
          TildeFullEqual: "≅",
          TildeTilde: "≈",
          times: "×",
          timesb: "⊠",
          timesbar: "⨱",
          timesd: "⨰",
          tint: "∭",
          toea: "⤨",
          top: "⊤",
          topbot: "⌶",
          topcir: "⫱",
          topf: "𝕥",
          Topf: "𝕋",
          topfork: "⫚",
          tosa: "⤩",
          tprime: "‴",
          trade: "™",
          TRADE: "™",
          triangle: "▵",
          triangledown: "▿",
          triangleleft: "◃",
          trianglelefteq: "⊴",
          triangleq: "≜",
          triangleright: "▹",
          trianglerighteq: "⊵",
          tridot: "◬",
          trie: "≜",
          triminus: "⨺",
          TripleDot: "⃛",
          triplus: "⨹",
          trisb: "⧍",
          tritime: "⨻",
          trpezium: "⏢",
          tscr: "𝓉",
          Tscr: "𝒯",
          tscy: "ц",
          TScy: "Ц",
          tshcy: "ћ",
          TSHcy: "Ћ",
          tstrok: "ŧ",
          Tstrok: "Ŧ",
          twixt: "≬",
          twoheadleftarrow: "↞",
          twoheadrightarrow: "↠",
          uacute: "ú",
          Uacute: "Ú",
          uarr: "↑",
          uArr: "⇑",
          Uarr: "↟",
          Uarrocir: "⥉",
          ubrcy: "ў",
          Ubrcy: "Ў",
          ubreve: "ŭ",
          Ubreve: "Ŭ",
          ucirc: "û",
          Ucirc: "Û",
          ucy: "у",
          Ucy: "У",
          udarr: "⇅",
          udblac: "ű",
          Udblac: "Ű",
          udhar: "⥮",
          ufisht: "⥾",
          ufr: "𝔲",
          Ufr: "𝔘",
          ugrave: "ù",
          Ugrave: "Ù",
          uHar: "⥣",
          uharl: "↿",
          uharr: "↾",
          uhblk: "▀",
          ulcorn: "⌜",
          ulcorner: "⌜",
          ulcrop: "⌏",
          ultri: "◸",
          umacr: "ū",
          Umacr: "Ū",
          uml: "¨",
          UnderBar: "_",
          UnderBrace: "⏟",
          UnderBracket: "⎵",
          UnderParenthesis: "⏝",
          Union: "⋃",
          UnionPlus: "⊎",
          uogon: "ų",
          Uogon: "Ų",
          uopf: "𝕦",
          Uopf: "𝕌",
          uparrow: "↑",
          Uparrow: "⇑",
          UpArrow: "↑",
          UpArrowBar: "⤒",
          UpArrowDownArrow: "⇅",
          updownarrow: "↕",
          Updownarrow: "⇕",
          UpDownArrow: "↕",
          UpEquilibrium: "⥮",
          upharpoonleft: "↿",
          upharpoonright: "↾",
          uplus: "⊎",
          UpperLeftArrow: "↖",
          UpperRightArrow: "↗",
          upsi: "υ",
          Upsi: "ϒ",
          upsih: "ϒ",
          upsilon: "υ",
          Upsilon: "Υ",
          UpTee: "⊥",
          UpTeeArrow: "↥",
          upuparrows: "⇈",
          urcorn: "⌝",
          urcorner: "⌝",
          urcrop: "⌎",
          uring: "ů",
          Uring: "Ů",
          urtri: "◹",
          uscr: "𝓊",
          Uscr: "𝒰",
          utdot: "⋰",
          utilde: "ũ",
          Utilde: "Ũ",
          utri: "▵",
          utrif: "▴",
          uuarr: "⇈",
          uuml: "ü",
          Uuml: "Ü",
          uwangle: "⦧",
          vangrt: "⦜",
          varepsilon: "ϵ",
          varkappa: "ϰ",
          varnothing: "∅",
          varphi: "ϕ",
          varpi: "ϖ",
          varpropto: "∝",
          varr: "↕",
          vArr: "⇕",
          varrho: "ϱ",
          varsigma: "ς",
          varsubsetneq: "⊊︀",
          varsubsetneqq: "⫋︀",
          varsupsetneq: "⊋︀",
          varsupsetneqq: "⫌︀",
          vartheta: "ϑ",
          vartriangleleft: "⊲",
          vartriangleright: "⊳",
          vBar: "⫨",
          Vbar: "⫫",
          vBarv: "⫩",
          vcy: "в",
          Vcy: "В",
          vdash: "⊢",
          vDash: "⊨",
          Vdash: "⊩",
          VDash: "⊫",
          Vdashl: "⫦",
          vee: "∨",
          Vee: "⋁",
          veebar: "⊻",
          veeeq: "≚",
          vellip: "⋮",
          verbar: "|",
          Verbar: "‖",
          vert: "|",
          Vert: "‖",
          VerticalBar: "∣",
          VerticalLine: "|",
          VerticalSeparator: "❘",
          VerticalTilde: "≀",
          VeryThinSpace: " ",
          vfr: "𝔳",
          Vfr: "𝔙",
          vltri: "⊲",
          vnsub: "⊂⃒",
          vnsup: "⊃⃒",
          vopf: "𝕧",
          Vopf: "𝕍",
          vprop: "∝",
          vrtri: "⊳",
          vscr: "𝓋",
          Vscr: "𝒱",
          vsubne: "⊊︀",
          vsubnE: "⫋︀",
          vsupne: "⊋︀",
          vsupnE: "⫌︀",
          Vvdash: "⊪",
          vzigzag: "⦚",
          wcirc: "ŵ",
          Wcirc: "Ŵ",
          wedbar: "⩟",
          wedge: "∧",
          Wedge: "⋀",
          wedgeq: "≙",
          weierp: "℘",
          wfr: "𝔴",
          Wfr: "𝔚",
          wopf: "𝕨",
          Wopf: "𝕎",
          wp: "℘",
          wr: "≀",
          wreath: "≀",
          wscr: "𝓌",
          Wscr: "𝒲",
          xcap: "⋂",
          xcirc: "◯",
          xcup: "⋃",
          xdtri: "▽",
          xfr: "𝔵",
          Xfr: "𝔛",
          xharr: "⟷",
          xhArr: "⟺",
          xi: "ξ",
          Xi: "Ξ",
          xlarr: "⟵",
          xlArr: "⟸",
          xmap: "⟼",
          xnis: "⋻",
          xodot: "⨀",
          xopf: "𝕩",
          Xopf: "𝕏",
          xoplus: "⨁",
          xotime: "⨂",
          xrarr: "⟶",
          xrArr: "⟹",
          xscr: "𝓍",
          Xscr: "𝒳",
          xsqcup: "⨆",
          xuplus: "⨄",
          xutri: "△",
          xvee: "⋁",
          xwedge: "⋀",
          yacute: "ý",
          Yacute: "Ý",
          yacy: "я",
          YAcy: "Я",
          ycirc: "ŷ",
          Ycirc: "Ŷ",
          ycy: "ы",
          Ycy: "Ы",
          yen: "¥",
          yfr: "𝔶",
          Yfr: "𝔜",
          yicy: "ї",
          YIcy: "Ї",
          yopf: "𝕪",
          Yopf: "𝕐",
          yscr: "𝓎",
          Yscr: "𝒴",
          yucy: "ю",
          YUcy: "Ю",
          yuml: "ÿ",
          Yuml: "Ÿ",
          zacute: "ź",
          Zacute: "Ź",
          zcaron: "ž",
          Zcaron: "Ž",
          zcy: "з",
          Zcy: "З",
          zdot: "ż",
          Zdot: "Ż",
          zeetrf: "ℨ",
          ZeroWidthSpace: "​",
          zeta: "ζ",
          Zeta: "Ζ",
          zfr: "𝔷",
          Zfr: "ℨ",
          zhcy: "ж",
          ZHcy: "Ж",
          zigrarr: "⇝",
          zopf: "𝕫",
          Zopf: "ℤ",
          zscr: "𝓏",
          Zscr: "𝒵",
          zwj: "‍",
          zwnj: "‌",
        },
        b = {
          aacute: "á",
          Aacute: "Á",
          acirc: "â",
          Acirc: "Â",
          acute: "´",
          aelig: "æ",
          AElig: "Æ",
          agrave: "à",
          Agrave: "À",
          amp: "&",
          AMP: "&",
          aring: "å",
          Aring: "Å",
          atilde: "ã",
          Atilde: "Ã",
          auml: "ä",
          Auml: "Ä",
          brvbar: "¦",
          ccedil: "ç",
          Ccedil: "Ç",
          cedil: "¸",
          cent: "¢",
          copy: "©",
          COPY: "©",
          curren: "¤",
          deg: "°",
          divide: "÷",
          eacute: "é",
          Eacute: "É",
          ecirc: "ê",
          Ecirc: "Ê",
          egrave: "è",
          Egrave: "È",
          eth: "ð",
          ETH: "Ð",
          euml: "ë",
          Euml: "Ë",
          frac12: "½",
          frac14: "¼",
          frac34: "¾",
          gt: ">",
          GT: ">",
          iacute: "í",
          Iacute: "Í",
          icirc: "î",
          Icirc: "Î",
          iexcl: "¡",
          igrave: "ì",
          Igrave: "Ì",
          iquest: "¿",
          iuml: "ï",
          Iuml: "Ï",
          laquo: "«",
          lt: "<",
          LT: "<",
          macr: "¯",
          micro: "µ",
          middot: "·",
          nbsp: " ",
          not: "¬",
          ntilde: "ñ",
          Ntilde: "Ñ",
          oacute: "ó",
          Oacute: "Ó",
          ocirc: "ô",
          Ocirc: "Ô",
          ograve: "ò",
          Ograve: "Ò",
          ordf: "ª",
          ordm: "º",
          oslash: "ø",
          Oslash: "Ø",
          otilde: "õ",
          Otilde: "Õ",
          ouml: "ö",
          Ouml: "Ö",
          para: "¶",
          plusmn: "±",
          pound: "£",
          quot: '"',
          QUOT: '"',
          raquo: "»",
          reg: "®",
          REG: "®",
          sect: "§",
          shy: "­",
          sup1: "¹",
          sup2: "²",
          sup3: "³",
          szlig: "ß",
          thorn: "þ",
          THORN: "Þ",
          times: "×",
          uacute: "ú",
          Uacute: "Ú",
          ucirc: "û",
          Ucirc: "Û",
          ugrave: "ù",
          Ugrave: "Ù",
          uml: "¨",
          uuml: "ü",
          Uuml: "Ü",
          yacute: "ý",
          Yacute: "Ý",
          yen: "¥",
          yuml: "ÿ",
        },
        E = {
          0: "�",
          128: "€",
          130: "‚",
          131: "ƒ",
          132: "„",
          133: "…",
          134: "†",
          135: "‡",
          136: "ˆ",
          137: "‰",
          138: "Š",
          139: "‹",
          140: "Œ",
          142: "Ž",
          145: "‘",
          146: "’",
          147: "“",
          148: "”",
          149: "•",
          150: "–",
          151: "—",
          152: "˜",
          153: "™",
          154: "š",
          155: "›",
          156: "œ",
          158: "ž",
          159: "Ÿ",
        },
        x = [
          1, 2, 3, 4, 5, 6, 7, 8, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
          23, 24, 25, 26, 27, 28, 29, 30, 31, 127, 128, 129, 130, 131, 132, 133,
          134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
          148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 64976,
          64977, 64978, 64979, 64980, 64981, 64982, 64983, 64984, 64985, 64986,
          64987, 64988, 64989, 64990, 64991, 64992, 64993, 64994, 64995, 64996,
          64997, 64998, 64999, 65e3, 65001, 65002, 65003, 65004, 65005, 65006,
          65007, 65534, 65535, 131070, 131071, 196606, 196607, 262142, 262143,
          327678, 327679, 393214, 393215, 458750, 458751, 524286, 524287,
          589822, 589823, 655358, 655359, 720894, 720895, 786430, 786431,
          851966, 851967, 917502, 917503, 983038, 983039, 1048574, 1048575,
          1114110, 1114111,
        ],
        v = String.fromCharCode,
        A = {}.hasOwnProperty,
        N = function (e, r) {
          return A.call(e, r);
        },
        T = function (e, r) {
          if (!e) return r;
          var t,
            a = {};
          for (t in r) a[t] = N(e, t) ? e[t] : r[t];
          return a;
        },
        y = function (e, r) {
          var t = "";
          return (e >= 55296 && e <= 57343) || e > 1114111
            ? (r &&
                S("character reference outside the permissible Unicode range"),
              "�")
            : N(E, e)
            ? (r && S("disallowed character reference"), E[e])
            : (r &&
                (function (e, r) {
                  for (var t = -1, a = e.length; ++t < a; )
                    if (e[t] == r) return !0;
                  return !1;
                })(x, e) &&
                S("disallowed character reference"),
              e > 65535 &&
                ((t += v((((e -= 65536) >>> 10) & 1023) | 55296)),
                (e = 56320 | (1023 & e))),
              (t += v(e)));
        },
        w = function (e) {
          return "&#x" + e.toString(16).toUpperCase() + ";";
        },
        D = function (e) {
          return "&#" + e + ";";
        },
        S = function (e) {
          throw Error("Parse error: " + e);
        },
        L = function (e, r) {
          (r = T(r, L.options)).strict &&
            g.test(e) &&
            S("forbidden code point");
          var t = r.encodeEverything,
            a = r.useNamedReferences,
            n = r.allowUnsafeSymbols,
            o = r.decimal ? D : w,
            h = function (e) {
              return o(e.charCodeAt(0));
            };
          return (
            t
              ? ((e = e.replace(i, function (e) {
                  return a && N(c, e) ? "&" + c[e] + ";" : h(e);
                })),
                a &&
                  (e = e
                    .replace(/&gt;\u20D2/g, "&nvgt;")
                    .replace(/&lt;\u20D2/g, "&nvlt;")
                    .replace(/&#x66;&#x6A;/g, "&fjlig;")),
                a &&
                  (e = e.replace(u, function (e) {
                    return "&" + c[e] + ";";
                  })))
              : a
              ? (n ||
                  (e = e.replace(p, function (e) {
                    return "&" + c[e] + ";";
                  })),
                (e = (e = e
                  .replace(/&gt;\u20D2/g, "&nvgt;")
                  .replace(/&lt;\u20D2/g, "&nvlt;")).replace(u, function (e) {
                  return "&" + c[e] + ";";
                })))
              : n || (e = e.replace(p, h)),
            e
              .replace(s, function (e) {
                var r = e.charCodeAt(0),
                  t = e.charCodeAt(1);
                return o(1024 * (r - 55296) + t - 56320 + 65536);
              })
              .replace(l, h)
          );
        };
      L.options = {
        allowUnsafeSymbols: !1,
        encodeEverything: !1,
        strict: !1,
        useNamedReferences: !1,
        decimal: !1,
      };
      var C = function (e, r) {
        var t = (r = T(r, C.options)).strict;
        return (
          t && d.test(e) && S("malformed character reference"),
          e.replace(m, function (e, a, n, o, s, i, l, u, c) {
            var p, h, d, g, m, E;
            return a
              ? f[(m = a)]
              : n
              ? ((m = n),
                (E = o) && r.isAttributeValue
                  ? (t &&
                      "=" == E &&
                      S("`&` did not start a character reference"),
                    e)
                  : (t &&
                      S(
                        "named character reference was not terminated by a semicolon"
                      ),
                    b[m] + (E || "")))
              : s
              ? ((d = s),
                (h = i),
                t &&
                  !h &&
                  S("character reference was not terminated by a semicolon"),
                (p = parseInt(d, 10)),
                y(p, t))
              : l
              ? ((g = l),
                (h = u),
                t &&
                  !h &&
                  S("character reference was not terminated by a semicolon"),
                (p = parseInt(g, 16)),
                y(p, t))
              : (t &&
                  S(
                    "named character reference was not terminated by a semicolon"
                  ),
                e);
          })
        );
      };
      C.options = { isAttributeValue: !1, strict: !1 };
      var q = {
        version: "1.2.0",
        encode: L,
        decode: C,
        escape: function (e) {
          return e.replace(p, function (e) {
            return h[e];
          });
        },
        unescape: C,
      };
      if (a && !a.nodeType)
        if (n) n.exports = q;
        else for (var O in q) N(q, O) && (a[O] = q[O]);
      else t.he = q;
    })(commonjsGlobal);
  }),
  XML_S = "[ \t\r\n]+",
  XML_EQ = "(" + XML_S + ")?=(" + XML_S + ")?",
  XML_CHAR_REF = "&#[0-9]+;|&#x[0-9a-fA-F]+;",
  XML10_VERSION_INFO = XML_S + "version" + XML_EQ + "(\"1\\.0\"|'1\\.0')",
  XML10_BASE_CHAR =
    "A-Za-zÀ-ÖØ-öø-ÿĀ-ıĴ-ľŁ-ňŊ-žƀ-ǃǍ-ǰǴ-ǵǺ-ȗɐ-ʨʻ-ˁΆΈ-ΊΌΎ-ΡΣ-ώϐ-ϖϚϜϞϠϢ-ϳЁ-ЌЎ-яё-ќў-ҁҐ-ӄӇ-ӈӋ-ӌӐ-ӫӮ-ӵӸ-ӹԱ-Ֆՙա-ֆא-תװ-ײء-غف-يٱ-ڷں-ھۀ-ێې-ۓەۥ-ۦअ-हऽक़-ॡঅ-ঌএ-ঐও-নপ-রলশ-হড়-ঢ়য়-ৡৰ-ৱਅ-ਊਏ-ਐਓ-ਨਪ-ਰਲ-ਲ਼ਵ-ਸ਼ਸ-ਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઋઍએ-ઑઓ-નપ-રલ-ળવ-હઽૠଅ-ଌଏ-ଐଓ-ନପ-ରଲ-ଳଶ-ହଽଡ଼-ଢ଼ୟ-ୡஅ-ஊஎ-ஐஒ-கங-சஜஞ-டண-தந-பம-வஷ-ஹఅ-ఌఎ-ఐఒ-నప-ళవ-హౠ-ౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹೞೠ-ೡഅ-ഌഎ-ഐഒ-നപ-ഹൠ-ൡก-ฮะา-ำเ-ๅກ-ຂຄງ-ຈຊຍດ-ທນ-ຟມ-ຣລວສ-ຫອ-ຮະາ-ຳຽເ-ໄཀ-ཇཉ-ཀྵႠ-Ⴥა-ჶᄀᄂ-ᄃᄅ-ᄇᄉᄋ-ᄌᄎ-ᄒᄼᄾᅀᅌᅎᅐᅔ-ᅕᅙᅟ-ᅡᅣᅥᅧᅩᅭ-ᅮᅲ-ᅳᅵᆞᆨᆫᆮ-ᆯᆷ-ᆸᆺᆼ-ᇂᇫᇰᇹḀ-ẛẠ-ỹἀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼΩK-Å℮ↀ-ↂぁ-ゔァ-ヺㄅ-ㄬ가-힣",
  XML10_IDEOGRAPHIC = "一-龥〇〡-〩",
  XML10_COMBINING_CHAR =
    "̀-͠ͅ-҃͡-֑҆-֣֡-ֹֻ-ֽֿׁ-ׂًׄ-ْٰۖ-ۜ۝-۟۠-ۤۧ-۪ۨ-ۭँ-ः़ा-ौ्॑-॔ॢ-ॣঁ-ঃ়ািী-ৄে-ৈো-্ৗৢ-ৣਂ਼ਾਿੀ-ੂੇ-ੈੋ-੍ੰ-ੱઁ-ઃ઼ા-ૅે-ૉો-્ଁ-ଃ଼ା-ୃେ-ୈୋ-୍ୖ-ୗஂ-ஃா-ூெ-ைொ-்ௗఁ-ఃా-ౄె-ైొ-్ౕ-ౖಂ-ಃಾ-ೄೆ-ೈೊ-್ೕ-ೖം-ഃാ-ൃെ-ൈൊ-്ൗัิ-ฺ็-๎ັິ-ູົ-ຼ່-ໍ༘-༹༙༵༷༾༿ཱ-྄྆-ྋྐ-ྕྗྙ-ྭྱ-ྷྐྵ⃐-〪⃜⃡-゙゚〯",
  XML10_DIGIT = "0-9٠-٩۰-۹०-९০-৯੦-੯૦-૯୦-୯௧-௯౦-౯೦-೯൦-൯๐-๙໐-໙༠-༩",
  XML10_EXTENDER = "·ːˑ·ـๆໆ々〱-〵ゝ-ゞー-ヾ",
  XML10_LETTER = XML10_BASE_CHAR + XML10_IDEOGRAPHIC,
  XML10_NAME_CHAR =
    XML10_LETTER +
    XML10_DIGIT +
    "\\._:" +
    XML10_COMBINING_CHAR +
    XML10_EXTENDER +
    "-",
  XML10_NAME = "[" + XML10_LETTER + "_:][" + XML10_NAME_CHAR + "]*",
  XML10_ENTITY_REF = "&" + XML10_NAME + ";",
  XML10_REFERENCE = XML10_ENTITY_REF + "|" + XML_CHAR_REF,
  XML10_ATT_VALUE =
    '"(([^<&"]|' +
    XML10_REFERENCE +
    ")*)\"|'(([^<&']|" +
    XML10_REFERENCE +
    ")*)'",
  XML10_ATTRIBUTE =
    "(" + XML10_NAME + ")" + XML_EQ + "(" + XML10_ATT_VALUE + ")",
  XML11_VERSION_INFO = XML_S + "version" + XML_EQ + "(\"1\\.1\"|'1\\.1')",
  XML11_NAME_START_CHAR = ":A-Z_a-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-῿‌-‍⁰-↏Ⰰ-⿯、-퟿豈-﷏ﷰ-�",
  XML11_NAME_CHAR = XML11_NAME_START_CHAR + "\\.0-9·̀-ͯ‿-⁀-",
  XML11_NAME = "[" + XML11_NAME_START_CHAR + "][" + XML11_NAME_CHAR + "]*",
  XML11_ENTITY_REF = "&" + XML11_NAME + ";",
  XML11_REFERENCE = XML11_ENTITY_REF + "|" + XML_CHAR_REF,
  XML11_ATT_VALUE =
    '"(([^<&"]|' +
    XML11_REFERENCE +
    ")*)\"|'(([^<&']|" +
    XML11_REFERENCE +
    ")*)'",
  XML11_ATTRIBUTE =
    "(" + XML11_NAME + ")" + XML_EQ + "(" + XML11_ATT_VALUE + ")",
  XML_NC_NAME_CHAR =
    XML10_LETTER +
    XML10_DIGIT +
    "\\._" +
    XML10_COMBINING_CHAR +
    XML10_EXTENDER +
    "-",
  XML_NC_NAME = "[" + XML10_LETTER + "_][" + XML_NC_NAME_CHAR + "]*",
  XML10_TAGNAME_REGEXP = new RegExp("^(" + XML10_NAME + ")"),
  XML10_ATTRIBUTE_REGEXP = new RegExp(XML10_ATTRIBUTE, "g"),
  XML11_TAGNAME_REGEXP = new RegExp("^(" + XML11_NAME + ")"),
  XML11_ATTRIBUTE_REGEXP = new RegExp(XML11_ATTRIBUTE, "g");
export function xmlParse(e) {
  var r,
    t,
    a = /\/$/;
  if (e.match(/^<\?xml/))
    if (5 == e.search(new RegExp(XML10_VERSION_INFO)))
      (r = XML10_TAGNAME_REGEXP), (t = XML10_ATTRIBUTE_REGEXP);
    else {
      if (5 != e.search(new RegExp(XML11_VERSION_INFO)))
        throw "VersionInfo is missing, or unknown version number.";
      (r = XML11_TAGNAME_REGEXP), (t = XML11_ATTRIBUTE_REGEXP);
    }
  else (r = XML10_TAGNAME_REGEXP), (t = XML10_ATTRIBUTE_REGEXP);
  var n = new XDocument(),
    o = n,
    s = [],
    i = o;
  s.push(i);
  for (var l = !1, u = !1, c = !1, p = 0, h = 0; h < e.length; ++h) {
    var d = e.charAt(h);
    if (l && !c && "'" === d) u = !u;
    else if (l && !u && '"' === d) c = !c;
    else if (!l || ">" !== d || u || c) {
      if (!l && "<" === d) {
        var g = e.slice(p, h);
        if (
          (g && i != o && domAppendChild(i, domCreateTextNode(n, g)),
          "!--" === e.slice(h + 1, h + 4))
        ) {
          var m = e.slice(h + 4).indexOf("--\x3e");
          if (m)
            domAppendChild(i, domCreateComment(n, e.slice(h + 4, h + m + 4))),
              (h += m + 6);
        } else if ("![CDATA[" === e.slice(h + 1, h + 9)) {
          var f = e.slice(h + 9).indexOf("]]>");
          if (f)
            domAppendChild(
              i,
              domCreateCDATASection(n, e.slice(h + 9, h + f + 9))
            ),
              (h += f + 11);
        } else l = !0;
        p = h + 1;
      }
    } else {
      var b = e.slice(p, h);
      if ("/" == b.charAt(0)) s.pop(), (i = s[s.length - 1]);
      else if ("?" == b.charAt(0));
      else if ("!" == b.charAt(0));
      else {
        for (
          var E = b.match(a), x = domCreateElement(n, r.exec(b)[1]), v = void 0;
          (v = t.exec(b));

        ) {
          var A = he.decode(v[5] || v[7] || "");
          domSetAttribute(x, v[1], A);
        }
        domAppendChild(i, x), E || ((i = x), s.push(x));
      }
      (p = h + 1), (l = !1), (u = !1), (c = !1);
    }
  }
  return o;
}
var DOM_ELEMENT_NODE = 1,
  DOM_ATTRIBUTE_NODE = 2,
  DOM_TEXT_NODE = 3,
  DOM_CDATA_SECTION_NODE = 4,
  DOM_PROCESSING_INSTRUCTION_NODE = 7,
  DOM_COMMENT_NODE = 8,
  DOM_DOCUMENT_NODE = 9,
  DOM_DOCUMENT_FRAGMENT_NODE = 11;
function domTraverseElements(e, r, t) {
  var a;
  if (r && "boolean" == typeof (a = r.call(null, e)) && !a) return !1;
  for (var n = e.firstChild; n; n = n.nextSibling)
    if (
      n.nodeType == DOM_ELEMENT_NODE &&
      "boolean" == typeof (a = domTraverseElements.call(this, n, r, t)) &&
      !a
    )
      return !1;
  return !(t && "boolean" == typeof (a = t.call(null, e)) && !a) && void 0;
}
var _unusedXNodes = [],
  XNode = function (e, r, t, a) {
    (this.attributes = []), (this.childNodes = []), this.init(e, r, t, a);
  };
(XNode.prototype.init = function (e, r, t, a) {
  (this.nodeType = e - 0),
    (this.nodeName = "" + r),
    (this.nodeValue = "" + t),
    (this.ownerDocument = a),
    (this.firstChild = null),
    (this.lastChild = null),
    (this.nextSibling = null),
    (this.previousSibling = null),
    (this.parentNode = null);
}),
  (XNode.recycle = function (e) {
    if (e)
      if (e.constructor != XDocument) {
        if (e.constructor == this) {
          _unusedXNodes.push(e);
          for (var r = 0; r < e.attributes.length; ++r)
            this.recycle(e.attributes[r]);
          for (var t = 0; t < e.childNodes.length; ++t)
            this.recycle(e.childNodes[t]);
          (e.attributes.length = 0),
            (e.childNodes.length = 0),
            e.init.call(0, "", "", null);
        }
      } else this.recycle(e.documentElement);
  }),
  (XNode.prototype.create = function (e, r, t, a) {
    if (_unusedXNodes.length > 0) {
      var n = _unusedXNodes.pop();
      return n.init(e, r, t, a), n;
    }
    return new XNode(e, r, t, a);
  }),
  (XNode.prototype.appendChild = function (e) {
    0 == this.childNodes.length && (this.firstChild = e),
      (e.previousSibling = this.lastChild),
      (e.nextSibling = null),
      this.lastChild && (this.lastChild.nextSibling = e),
      (e.parentNode = this),
      (this.lastChild = e),
      this.childNodes.push(e);
  }),
  (XNode.prototype.replaceChild = function (e, r) {
    if (r != e)
      for (var t = 0; t < this.childNodes.length; ++t)
        if (this.childNodes[t] == r) {
          this.childNodes[t] = e;
          var a = r.parentNode;
          (r.parentNode = null),
            (e.parentNode = a),
            (a = r.previousSibling),
            (r.previousSibling = null),
            (e.previousSibling = a),
            e.previousSibling && (e.previousSibling.nextSibling = e),
            (a = r.nextSibling),
            (r.nextSibling = null),
            (e.nextSibling = a),
            e.nextSibling && (e.nextSibling.previousSibling = e),
            this.firstChild == r && (this.firstChild = e),
            this.lastChild == r && (this.lastChild = e);
          break;
        }
  }),
  (XNode.prototype.insertBefore = function (e, r) {
    if (r != e && r.parentNode == this) {
      e.parentNode && e.parentNode.removeChild(e);
      for (var t = [], a = 0, n = this.childNodes; a < n.length; a += 1) {
        var o = n[a];
        o == r &&
          (t.push(e),
          (e.parentNode = this),
          (e.previousSibling = r.previousSibling),
          (r.previousSibling = e),
          e.previousSibling && (e.previousSibling.nextSibling = e),
          (e.nextSibling = r),
          this.firstChild == r && (this.firstChild = e)),
          t.push(o);
      }
      this.childNodes = t;
    }
  }),
  (XNode.prototype.removeChild = function (e) {
    for (var r = [], t = 0, a = this.childNodes; t < a.length; t += 1) {
      var n = a[t];
      n != e
        ? r.push(n)
        : (n.previousSibling && (n.previousSibling.nextSibling = n.nextSibling),
          n.nextSibling && (n.nextSibling.previousSibling = n.previousSibling),
          this.firstChild == n && (this.firstChild = n.nextSibling),
          this.lastChild == n && (this.lastChild = n.previousSibling));
    }
    this.childNodes = r;
  }),
  (XNode.prototype.hasAttributes = function () {
    return this.attributes.length > 0;
  }),
  (XNode.prototype.setAttribute = function (e, r) {
    for (var t = 0; t < this.attributes.length; ++t)
      if (this.attributes[t].nodeName == e)
        return void (this.attributes[t].nodeValue = "" + r);
    this.attributes.push(this.create(DOM_ATTRIBUTE_NODE, e, r, this));
  }),
  (XNode.prototype.getAttribute = function (e) {
    for (var r = 0; r < this.attributes.length; ++r)
      if (this.attributes[r].nodeName == e) return this.attributes[r].nodeValue;
    return null;
  }),
  (XNode.prototype.removeAttribute = function (e) {
    for (var r = [], t = 0; t < this.attributes.length; ++t)
      this.attributes[t].nodeName != e && r.push(this.attributes[t]);
    this.attributes = r;
  }),
  (XNode.prototype.getElementsByTagName = function (e) {
    var r = [],
      t = this;
    return (
      domTraverseElements(
        this,
        "*" == e
          ? function (e) {
              t != e && r.push(e);
            }
          : function (a) {
              t != a && a.nodeName == e && r.push(a);
            },
        null
      ),
      r
    );
  }),
  (XNode.prototype.getElementById = function (e) {
    var r = null;
    return (
      domTraverseElements(
        this,
        function (t) {
          if (t.getAttribute("id") == e) return (r = t), !1;
        },
        null
      ),
      r
    );
  });
var XDocument = (function (e) {
    function r() {
      e.call(this, DOM_DOCUMENT_NODE, "#document", null, null),
        (this.documentElement = null);
    }
    return (
      e && (r.__proto__ = e),
      (r.prototype = Object.create(e && e.prototype)),
      (r.prototype.constructor = r),
      (r.prototype.clear = function () {
        this.recycle(this.documentElement), (this.documentElement = null);
      }),
      (r.prototype.appendChild = function (r) {
        e.prototype.appendChild.call(this, r),
          (this.documentElement = this.childNodes[0]);
      }),
      (r.prototype.createElement = function (r) {
        return e.prototype.create.call(this, DOM_ELEMENT_NODE, r, null, this);
      }),
      (r.prototype.createDocumentFragment = function () {
        return e.prototype.create.call(
          this,
          DOM_DOCUMENT_FRAGMENT_NODE,
          "#document-fragment",
          null,
          this
        );
      }),
      (r.prototype.createTextNode = function (r) {
        return e.prototype.create.call(this, DOM_TEXT_NODE, "#text", r, this);
      }),
      (r.prototype.createAttribute = function (r) {
        return e.prototype.create.call(this, DOM_ATTRIBUTE_NODE, r, null, this);
      }),
      (r.prototype.createComment = function (r) {
        return e.prototype.create.call(
          this,
          DOM_COMMENT_NODE,
          "#comment",
          r,
          this
        );
      }),
      (r.prototype.createCDATASection = function (r) {
        return e.prototype.create.call(
          this,
          DOM_CDATA_SECTION_NODE,
          "#cdata-section",
          r,
          this
        );
      }),
      r
    );
  })(XNode),
  toString = function (e) {
    var r;
    switch (e.constructor) {
      case FunctionCallExpr:
        r = e.name.value + "(";
        for (var t = 0; t < e.args.length; ++t)
          t > 0 && (r += ", "), (r += toString(e.args[t]));
        r += ")";
        break;
      case UnionExpr:
        r = toString(e.expr1) + " | " + toString(e.expr2);
        break;
      case PathExpr:
        r = "{path: {" + toString(e.filter) + "} {" + toString(e.rel) + "}}";
        break;
      case FilterExpr:
        r = toString(e.expr);
        for (var a = 0; a < e.predicate.length; ++a)
          r += toString(e.predicate[a]);
        break;
      case UnaryMinusExpr:
        r = "-" + toString(e.expr);
        break;
      case BinaryExpr:
        r = toString(e.expr1) + " " + e.op.value + " " + toString(e.expr2);
        break;
      case LiteralExpr:
        r = '"' + e.value + '"';
        break;
      case NumberExpr:
        r = "" + e.value;
        break;
      case VariableExpr:
        r = "$" + e.name;
        break;
      case XNode:
        r = e.nodeName;
        break;
      case ExprContext:
        r = "[" + e.position + "/" + e.nodelist.length + "] " + e.node.nodeName;
        break;
      case TokenExpr:
        r = e.value;
        break;
      case LocationExpr:
        (r = ""), e.absolute && (r += "/");
        for (var n = 0; n < e.steps.length; ++n)
          n > 0 && (r += "/"), (r += toString(e.steps[n]));
        break;
      case StepExpr:
        r = e.axis + "::" + toString(e.nodetest);
        for (var o = 0; o < e.predicate.length; ++o)
          r += toString(e.predicate[o]);
        break;
      case NodeTestAny:
        r = "node()";
        break;
      case NodeTestElementOrAttribute:
        r = "*";
        break;
      case NodeTestText:
        r = "text()";
        break;
      case NodeTestComment:
        r = "comment()";
        break;
      case NodeTestPI:
        r = "processing-instruction()";
        break;
      case NodeTestNC:
        r = e.nsprefix + ":*";
        break;
      case NodeTestName:
        r = e.name;
        break;
      case PredicateExpr:
        r = "[" + toString(e.expr) + "]";
    }
    return r;
  };
export function xpathParse(e, r) {
  void 0 === r && (r = function () {}), r("parse " + e), xpathParseInit(r);
  var t = xpathCacheLookup(e);
  if (t) return r(" ... cached"), t;
  if (e.match(/^(\$|@)?\w+$/i)) {
    var a = makeSimpleExpr(e);
    return (xpathParseCache[e] = a), r(" ... simple"), a;
  }
  if (e.match(/^\w+(\/\w+)*$/i)) {
    var n = makeSimpleExpr2(e);
    return (xpathParseCache[e] = n), r(" ... simple 2"), n;
  }
  for (
    var o = e, s = [], i = null, l = null, u = !1, c = 0, p = 0, h = 0;
    !u;

  ) {
    c++, (e = e.replace(/^\s*/, "")), (l = i), (i = null);
    for (var d = null, g = "", m = 0; m < xpathTokenRules.length; ++m) {
      var f = xpathTokenRules[m].re.exec(e);
      if ((p++, f && f.length > 0 && f[0].length > g.length)) {
        (d = xpathTokenRules[m]), (g = f[0]);
        break;
      }
    }
    for (
      !d ||
        (d != TOK_DIV && d != TOK_MOD && d != TOK_AND && d != TOK_OR) ||
        (l &&
          l.tag != TOK_AT &&
          l.tag != TOK_DSLASH &&
          l.tag != TOK_SLASH &&
          l.tag != TOK_AXIS &&
          l.tag != TOK_DOLLAR) ||
        (d = TOK_QNAME),
        d
          ? ((e = e.substr(g.length)),
            r("token: " + g + " -- " + d.label),
            (i = {
              tag: d,
              match: g,
              prec: d.prec ? d.prec : 0,
              expr: makeTokenExpr(g),
            }))
          : (r("DONE"), (u = !0));
      xpathReduce(s, i, r);

    )
      h++, r("stack: " + stackToString(s));
  }
  if ((r("stack: " + stackToString(s)), 1 != s.length))
    throw "XPath parse error " + o + ":\n" + stackToString(s);
  var b = s[0].expr;
  return (
    (xpathParseCache[o] = b), r("XPath parse: " + c + " / " + p + " / " + h), b
  );
}
var xpathParseCache = {};
function xpathCacheLookup(e) {
  return xpathParseCache[e];
}
function xpathReduce(e, r, t) {
  var a,
    n = null;
  if (e.length > 0) {
    var o = e[e.length - 1],
      s = xpathRules[o.tag.key];
    if (s)
      for (var i = 0; i < s.length; ++i) {
        var l = s[i],
          u = xpathMatchStack(e, l[1]);
        if (u.length) {
          (n = { tag: l[0], rule: l, match: u }).prec =
            xpathGrammarPrecedence(n);
          break;
        }
      }
  }
  if (n && (!r || n.prec > r.prec || (r.tag.left && n.prec >= r.prec))) {
    for (var c = 0; c < n.match.matchlength; ++c) e.pop();
    t(
      "reduce " +
        n.tag.label +
        " " +
        n.prec +
        " ahead " +
        (r
          ? r.tag.label + " " + r.prec + (r.tag.left ? " left" : "")
          : " none ")
    );
    var p = mapExpr(n.match, function (e) {
      return e.expr;
    });
    t("going to apply " + toString(n.rule[3])),
      (n.expr = n.rule[3].apply(null, p)),
      e.push(n),
      (a = !0);
  } else
    r &&
      (t(
        "shift " +
          r.tag.label +
          " " +
          r.prec +
          (r.tag.left ? " left" : "") +
          " over " +
          (n ? n.tag.label + " " + n.prec : " none")
      ),
      e.push(r)),
      (a = !1);
  return a;
}
function xpathMatchStack(e, r) {
  var t,
    a,
    n = e.length,
    o = r.length,
    s = [];
  s.matchlength = 0;
  var i = 0;
  for (t = o - 1, a = n - 1; t >= 0 && a >= 0; --t, a -= i) {
    i = 0;
    var l = [];
    if (r[t] == Q_MM)
      for (t -= 1, s.push(l); a - i >= 0 && e[a - i].tag == r[t]; )
        l.push(e[a - i]), (i += 1), (s.matchlength += 1);
    else if (r[t] == Q_01)
      for (t -= 1, s.push(l); a - i >= 0 && i < 2 && e[a - i].tag == r[t]; )
        l.push(e[a - i]), (i += 1), (s.matchlength += 1);
    else if (r[t] == Q_1M) {
      if (((t -= 1), s.push(l), e[a].tag != r[t])) return [];
      for (; a - i >= 0 && e[a - i].tag == r[t]; )
        l.push(e[a - i]), (i += 1), (s.matchlength += 1);
    } else {
      if (e[a].tag != r[t]) return [];
      s.push(e[a]), (i += 1), (s.matchlength += 1);
    }
    reverseInplace(l),
      (l.expr = mapExpr(l, function (e) {
        return e.expr;
      }));
  }
  return reverseInplace(s), -1 == t ? s : [];
}
function xpathTokenPrecedence(e) {
  return e.prec || 2;
}
function xpathGrammarPrecedence(e) {
  var r = 0;
  if (e.rule)
    if (e.rule.length >= 3 && e.rule[2] >= 0) r = e.rule[2];
    else
      for (var t = 0; t < e.rule[1].length; ++t) {
        var a = xpathTokenPrecedence(e.rule[1][t]);
        r = Math.max(r, a);
      }
  else if (e.tag) r = xpathTokenPrecedence(e.tag);
  else if (e.length)
    for (var n = 0; n < e.length; ++n) {
      var o = xpathGrammarPrecedence(e[n]);
      r = Math.max(r, o);
    }
  return r;
}
function stackToString(e) {
  for (var r = "", t = 0; t < e.length; ++t)
    r && (r += "\n"), (r += e[t].tag.label);
  return r;
}
export var ExprContext = function (e, r, t, a, n, o, s, i) {
  (this.node = e),
    (this.position = r || 0),
    (this.nodelist = t || [e]),
    (this.variables = {}),
    (this.parent = a || null),
    (this.caseInsensitive = n || !1),
    (this.ignoreAttributesWithoutValue = o || !1),
    (this.returnOnFirstMatch = s || !1),
    (this.ignoreNonElementNodesForNTA = i || !1),
    a
      ? (this.root = a.root)
      : this.node.nodeType == DOM_DOCUMENT_NODE
      ? (this.root = e)
      : (this.root = e.ownerDocument);
};
(ExprContext.prototype.clone = function (e, r, t) {
  return new ExprContext(
    e || this.node,
    void 0 !== r ? r : this.position,
    t || this.nodelist,
    this,
    this.caseInsensitive,
    this.ignoreAttributesWithoutValue,
    this.returnOnFirstMatch,
    this.ignoreNonElementNodesForNTA
  );
}),
  (ExprContext.prototype.setVariable = function (e, r) {
    r instanceof StringValue ||
    r instanceof BooleanValue ||
    r instanceof NumberValue ||
    r instanceof NodeSetValue
      ? (this.variables[e] = r)
      : "true" === r
      ? (this.variables[e] = new BooleanValue(!0))
      : "false" === r
      ? (this.variables[e] = new BooleanValue(!1))
      : TOK_NUMBER.re.test(r)
      ? (this.variables[e] = new NumberValue(r))
      : (this.variables[e] = new StringValue(r));
  }),
  (ExprContext.prototype.getVariable = function (e) {
    return void 0 !== this.variables[e]
      ? this.variables[e]
      : this.parent
      ? this.parent.getVariable(e)
      : null;
  }),
  (ExprContext.prototype.setNode = function (e) {
    (this.node = this.nodelist[e]), (this.position = e);
  }),
  (ExprContext.prototype.contextSize = function () {
    return this.nodelist.length;
  }),
  (ExprContext.prototype.isCaseInsensitive = function () {
    return this.caseInsensitive;
  }),
  (ExprContext.prototype.setCaseInsensitive = function (e) {
    return (this.caseInsensitive = e);
  }),
  (ExprContext.prototype.isIgnoreAttributesWithoutValue = function () {
    return this.ignoreAttributesWithoutValue;
  }),
  (ExprContext.prototype.setIgnoreAttributesWithoutValue = function (e) {
    return (this.ignoreAttributesWithoutValue = e);
  }),
  (ExprContext.prototype.isReturnOnFirstMatch = function () {
    return this.returnOnFirstMatch;
  }),
  (ExprContext.prototype.setReturnOnFirstMatch = function (e) {
    return (this.returnOnFirstMatch = e);
  }),
  (ExprContext.prototype.isIgnoreNonElementNodesForNTA = function () {
    return this.ignoreNonElementNodesForNTA;
  }),
  (ExprContext.prototype.setIgnoreNonElementNodesForNTA = function (e) {
    return (this.ignoreNonElementNodesForNTA = e);
  });
var StringValue = function (e) {
  (this.value = e), (this.type = "string");
};
(StringValue.prototype.stringValue = function () {
  return this.value;
}),
  (StringValue.prototype.booleanValue = function () {
    return this.value.length > 0;
  }),
  (StringValue.prototype.numberValue = function () {
    return this.value - 0;
  }),
  (StringValue.prototype.nodeSetValue = function () {
    throw this;
  });
var BooleanValue = function (e) {
  (this.value = e), (this.type = "boolean");
};
(BooleanValue.prototype.stringValue = function () {
  return "" + this.value;
}),
  (BooleanValue.prototype.booleanValue = function () {
    return this.value;
  }),
  (BooleanValue.prototype.numberValue = function () {
    return this.value ? 1 : 0;
  }),
  (BooleanValue.prototype.nodeSetValue = function () {
    throw this;
  });
var NumberValue = function (e) {
  (this.value = e), (this.type = "number");
};
(NumberValue.prototype.stringValue = function () {
  return "" + this.value;
}),
  (NumberValue.prototype.booleanValue = function () {
    return !!this.value;
  }),
  (NumberValue.prototype.numberValue = function () {
    return this.value - 0;
  }),
  (NumberValue.prototype.nodeSetValue = function () {
    throw this;
  });
var NodeSetValue = function (e) {
  (this.value = e), (this.type = "node-set");
};
(NodeSetValue.prototype.stringValue = function () {
  return 0 == this.value.length ? "" : xmlValue(this.value[0]);
}),
  (NodeSetValue.prototype.booleanValue = function () {
    return this.value.length > 0;
  }),
  (NodeSetValue.prototype.numberValue = function () {
    return this.stringValue() - 0;
  }),
  (NodeSetValue.prototype.nodeSetValue = function () {
    return this.value;
  });
var TokenExpr = function (e) {
  this.value = e;
};
TokenExpr.prototype.evaluate = function () {
  return new StringValue(this.value);
};
var LocationExpr = function () {
  (this.absolute = !1), (this.steps = []);
};
function xPathStep(e, r, t, a, n) {
  var o = r[t],
    s = n.clone(a);
  if (n.returnOnFirstMatch && !o.hasPositionalPredicate) {
    var i = o.evaluate(s).nodeSetValue(),
      l = i.length,
      u = o.predicate.length;
    e: for (var c = 0; c < l; ++c) {
      for (var p = i[c], h = 0; h < u; ++h)
        if (!o.predicate[h].evaluate(n.clone(p, c, i)).booleanValue())
          continue e;
      if (
        (t == r.length - 1 ? e.push(p) : xPathStep(e, r, t + 1, p, n),
        e.length > 0)
      )
        break;
    }
  } else {
    s.returnOnFirstMatch = !1;
    for (var d = o.evaluate(s).nodeSetValue(), g = 0; g < d.length; ++g)
      t == r.length - 1 ? e.push(d[g]) : xPathStep(e, r, t + 1, d[g], n);
  }
}
(LocationExpr.prototype.appendStep = function (e) {
  var r = this._combineSteps(this.steps[this.steps.length - 1], e);
  r ? (this.steps[this.steps.length - 1] = r) : this.steps.push(e);
}),
  (LocationExpr.prototype.prependStep = function (e) {
    var r = this._combineSteps(e, this.steps[0]);
    r ? (this.steps[0] = r) : this.steps.unshift(e);
  }),
  (LocationExpr.prototype._combineSteps = function (e, r) {
    if (!e) return null;
    if (!r) return null;
    var t = e.predicates && e.predicates.length > 0;
    if (e.nodetest instanceof NodeTestAny && !t)
      if (e.axis == xpathAxis.DESCENDANT_OR_SELF) {
        if (r.axis == xpathAxis.CHILD);
        else if (r.axis == xpathAxis.SELF)
          return (r.axis = xpathAxis.DESCENDANT_OR_SELF), r;
      } else if (e.axis == xpathAxis.DESCENDANT && r.axis == xpathAxis.SELF)
        return (r.axis = xpathAxis.DESCENDANT), r;
    return null;
  }),
  (LocationExpr.prototype.evaluate = function (e) {
    var r;
    r = this.absolute ? e.root : e.node;
    var t = [];
    return xPathStep(t, this.steps, 0, r, e), new NodeSetValue(t);
  });
var StepExpr = function (e, r, t) {
  (this.axis = e),
    (this.nodetest = r),
    (this.predicate = t || []),
    (this.hasPositionalPredicate = !1);
  for (var a = 0; a < this.predicate.length; ++a)
    if (predicateExprHasPositionalSelector(this.predicate[a].expr)) {
      this.hasPositionalPredicate = !0;
      break;
    }
};
(StepExpr.prototype.appendPredicate = function (e) {
  this.predicate.push(e),
    this.hasPositionalPredicate ||
      (this.hasPositionalPredicate = predicateExprHasPositionalSelector(
        e.expr
      ));
}),
  (StepExpr.prototype.evaluate = function (e) {
    var r = e.node,
      t = [],
      a = !1;
    if (
      (this.nodetest instanceof NodeTestAny && (a = !0),
      this.axis == xpathAxis.ANCESTOR_OR_SELF)
    ) {
      t.push(r);
      for (var n = r.parentNode; n; n = n.parentNode) t.push(n);
    } else if (this.axis == xpathAxis.ANCESTOR)
      for (var o = r.parentNode; o; o = o.parentNode) t.push(o);
    else if (this.axis == xpathAxis.ATTRIBUTE)
      if (null != this.nodetest.name) {
        if (r.attributes)
          if (r.attributes instanceof Array) copyArray(t, r.attributes);
          else if ("style" == this.nodetest.name) {
            var s = r.getAttribute("style");
            s && "string" != typeof s
              ? t.push(
                  XNode.create(DOM_ATTRIBUTE_NODE, "style", s.cssText, document)
                )
              : t.push(r.attributes[this.nodetest.name]);
          } else t.push(r.attributes[this.nodetest.name]);
      } else
        e.ignoreAttributesWithoutValue
          ? copyArrayIgnoringAttributesWithoutValue(t, r.attributes)
          : copyArray(t, r.attributes);
    else if (this.axis == xpathAxis.CHILD) copyArray(t, r.childNodes);
    else if (this.axis == xpathAxis.DESCENDANT_OR_SELF) {
      this.nodetest.evaluate(e).booleanValue() && t.push(r);
      var i = xpathExtractTagNameFromNodeTest(
        this.nodetest,
        e.ignoreNonElementNodesForNTA
      );
      xpathCollectDescendants(t, r, i), i && (a = !0);
    } else if (this.axis == xpathAxis.DESCENDANT) {
      var l = xpathExtractTagNameFromNodeTest(
        this.nodetest,
        e.ignoreNonElementNodesForNTA
      );
      xpathCollectDescendants(t, r, l), l && (a = !0);
    } else if (this.axis == xpathAxis.FOLLOWING)
      for (var u = r; u; u = u.parentNode)
        for (var c = u.nextSibling; c; c = c.nextSibling)
          t.push(c), xpathCollectDescendants(t, c);
    else if (this.axis == xpathAxis.FOLLOWING_SIBLING)
      for (var p = r.nextSibling; p; p = p.nextSibling) t.push(p);
    else {
      if (this.axis == xpathAxis.NAMESPACE)
        throw "not implemented: axis namespace";
      if (this.axis == xpathAxis.PARENT) r.parentNode && t.push(r.parentNode);
      else if (this.axis == xpathAxis.PRECEDING)
        for (var h = r; h; h = h.parentNode)
          for (var d = h.previousSibling; d; d = d.previousSibling)
            t.push(d), xpathCollectDescendantsReverse(t, d);
      else if (this.axis == xpathAxis.PRECEDING_SIBLING)
        for (var g = r.previousSibling; g; g = g.previousSibling) t.push(g);
      else {
        if (this.axis != xpathAxis.SELF)
          throw "ERROR -- NO SUCH AXIS: " + this.axis;
        t.push(r);
      }
    }
    if (!a) {
      var m = t;
      t = [];
      for (var f = 0; f < m.length; ++f) {
        var b = m[f];
        this.nodetest.evaluate(e.clone(b, f, m)).booleanValue() && t.push(b);
      }
    }
    if (!e.returnOnFirstMatch)
      for (var E = 0; E < this.predicate.length; ++E) {
        var x = t;
        t = [];
        for (var v = 0; v < x.length; ++v) {
          var A = x[v];
          this.predicate[E].evaluate(e.clone(A, v, x)).booleanValue() &&
            t.push(A);
        }
      }
    return new NodeSetValue(t);
  });
var NodeTestAny = function () {
  this.value = new BooleanValue(!0);
};
NodeTestAny.prototype.evaluate = function () {
  return this.value;
};
var NodeTestElementOrAttribute = function () {};
NodeTestElementOrAttribute.prototype.evaluate = function (e) {
  return new BooleanValue(
    e.node.nodeType == DOM_ELEMENT_NODE || e.node.nodeType == DOM_ATTRIBUTE_NODE
  );
};
var NodeTestText = function () {};
NodeTestText.prototype.evaluate = function (e) {
  return new BooleanValue(e.node.nodeType == DOM_TEXT_NODE);
};
var NodeTestComment = function () {};
NodeTestComment.prototype.evaluate = function (e) {
  return new BooleanValue(e.node.nodeType == DOM_COMMENT_NODE);
};
var NodeTestPI = function (e) {
  this.target = e;
};
NodeTestPI.prototype.evaluate = function (e) {
  return new BooleanValue(
    e.node.nodeType == DOM_PROCESSING_INSTRUCTION_NODE &&
      (!this.target || e.node.nodeName == this.target)
  );
};
var NodeTestNC = function (e) {
  (this.regex = new RegExp("^" + e + ":")), (this.nsprefix = e);
};
NodeTestNC.prototype.evaluate = function (e) {
  var r = e.node;
  return new BooleanValue(this.regex.match(r.nodeName));
};
var NodeTestName = function (e) {
  (this.name = e), (this.re = new RegExp("^" + e + "$", "i"));
};
NodeTestName.prototype.evaluate = function (e) {
  var r = e.node;
  return e.caseInsensitive
    ? r.nodeName.length != this.name.length
      ? new BooleanValue(!1)
      : new BooleanValue(this.re.test(r.nodeName))
    : new BooleanValue(r.nodeName == this.name);
};
var PredicateExpr = function (e) {
  this.expr = e;
};
PredicateExpr.prototype.evaluate = function (e) {
  var r = this.expr.evaluate(e);
  return "number" == r.type
    ? new BooleanValue(e.position == r.numberValue() - 1)
    : new BooleanValue(r.booleanValue());
};
var xpathfunctions = {
    last: function (e) {
      return assert(0 == this.args.length), new NumberValue(e.contextSize());
    },
    position: function (e) {
      return assert(0 == this.args.length), new NumberValue(e.position + 1);
    },
    count: function (e) {
      assert(1 == this.args.length);
      var r = this.args[0].evaluate(e);
      return new NumberValue(r.nodeSetValue().length);
    },
    "generate-id": function (e) {
      throw "not implmented yet: XPath function generate-id()";
    },
    id: function (e) {
      assert(1 == this.args.length);
      var r,
        t = this.args[0].evaluate(e),
        a = [];
      if ("node-set" == t.type) {
        r = [];
        for (var n = t.nodeSetValue(), o = 0; o < n.length; ++o)
          for (var s = xmlValue(n[o]).split(/\s+/), i = 0; i < s.length; ++i)
            r.push(s[i]);
      } else r = t.stringValue().split(/\s+/);
      for (var l = e.root, u = 0; u < r.length; ++u) {
        var c = l.getElementById(r[u]);
        c && a.push(c);
      }
      return new NodeSetValue(a);
    },
    "xml-to-json": function (e) {
      return (
        assert(this.args.length < 2),
        new StringValue(
          JSON.stringify(this.args.length ? xmlValue(e.node) : "null")
        )
      );
    },
    "local-name": function (e) {
      var r;
      return (
        assert(1 == this.args.length || 0 == this.args.length),
        0 ==
        (r =
          0 == this.args.length
            ? [e.node]
            : this.args[0].evaluate(e).nodeSetValue()).length
          ? new StringValue("")
          : new StringValue(r[0].nodeName.replace(/^[^:]+:/, ""))
      );
    },
    "namespace-uri": function () {
      throw "not implemented yet: XPath function namespace-uri()";
    },
    name: function (e) {
      var r;
      return (
        assert(1 == this.args.length || 0 == this.args.length),
        0 ==
        (r =
          0 == this.args.length
            ? [e.node]
            : this.args[0].evaluate(e).nodeSetValue()).length
          ? new StringValue("")
          : new StringValue(r[0].nodeName)
      );
    },
    string: function (e) {
      return (
        assert(1 == this.args.length || 0 == this.args.length),
        0 == this.args.length
          ? new StringValue(new NodeSetValue([e.node]).stringValue())
          : new StringValue(this.args[0].evaluate(e).stringValue())
      );
    },
    concat: function (e) {
      for (var r = "", t = 0; t < this.args.length; ++t)
        r += this.args[t].evaluate(e).stringValue();
      return new StringValue(r);
    },
    "starts-with": function (e) {
      assert(2 == this.args.length);
      var r = this.args[0].evaluate(e).stringValue(),
        t = this.args[1].evaluate(e).stringValue();
      return new BooleanValue(0 == r.indexOf(t));
    },
    "ends-with": function (e) {
      assert(2 == this.args.length);
      var r = this.args[0].evaluate(e).stringValue(),
        t = this.args[1].evaluate(e).stringValue(),
        a = new RegExp(regExpEscape(t) + "$");
      return new BooleanValue(a.test(r));
    },
    contains: function (e) {
      assert(2 == this.args.length);
      var r = this.args[0].evaluate(e).stringValue(),
        t = this.args[1].evaluate(e).stringValue();
      return new BooleanValue(r.includes(t));
    },
    "substring-before": function (e) {
      assert(2 == this.args.length);
      var r,
        t = this.args[0].evaluate(e).stringValue(),
        a = this.args[1].evaluate(e).stringValue(),
        n = t.indexOf(a);
      return (r = -1 == n ? "" : t.substr(0, n)), new StringValue(r);
    },
    "substring-after": function (e) {
      assert(2 == this.args.length);
      var r,
        t = this.args[0].evaluate(e).stringValue(),
        a = this.args[1].evaluate(e).stringValue(),
        n = t.indexOf(a);
      return (r = -1 == n ? "" : t.substr(n + a.length)), new StringValue(r);
    },
    substring: function (e) {
      assert(2 == this.args.length || 3 == this.args.length);
      var r,
        t = this.args[0].evaluate(e).stringValue(),
        a = this.args[1].evaluate(e).numberValue();
      if (2 == this.args.length) {
        var n = Math.max(0, Math.round(a) - 1);
        r = t.substr(n);
      } else {
        var o = this.args[2].evaluate(e).numberValue(),
          s = Math.round(a) - 1,
          i = Math.max(0, s),
          l = Math.round(o) - Math.max(0, -s);
        r = t.substr(i, l);
      }
      return new StringValue(r);
    },
    "string-length": function (e) {
      var r;
      return (
        (r =
          this.args.length > 0
            ? this.args[0].evaluate(e).stringValue()
            : new NodeSetValue([e.node]).stringValue()),
        new NumberValue(r.length)
      );
    },
    "normalize-space": function (e) {
      var r;
      return (
        (r = (r =
          this.args.length > 0
            ? this.args[0].evaluate(e).stringValue()
            : new NodeSetValue([e.node]).stringValue())
          .replace(/^\s*/, "")
          .replace(/\s*$/, "")
          .replace(/\s+/g, " ")),
        new StringValue(r)
      );
    },
    translate: function (e) {
      assert(3 == this.args.length);
      for (
        var r = this.args[0].evaluate(e).stringValue(),
          t = this.args[1].evaluate(e).stringValue(),
          a = this.args[2].evaluate(e).stringValue(),
          n = 0;
        n < t.length;
        ++n
      )
        r = r.replace(new RegExp(t.charAt(n), "g"), a.charAt(n));
      return new StringValue(r);
    },
    matches: function (e) {
      assert(this.args.length >= 2);
      var r,
        t,
        a = this.args[0].evaluate(e).stringValue(),
        n = this.args[1].evaluate(e).stringValue();
      if (
        this.args.length > 2 &&
        ((r = this.args[2].evaluate(e).stringValue()), /[^mi]/.test(r))
      )
        throw "Invalid regular expression syntax: " + r;
      try {
        t = new RegExp(n, r);
      } catch (e) {
        throw "Invalid matches argument: " + n;
      }
      return new BooleanValue(t.test(a));
    },
    boolean: function (e) {
      return (
        assert(1 == this.args.length),
        new BooleanValue(this.args[0].evaluate(e).booleanValue())
      );
    },
    not: function (e) {
      assert(1 == this.args.length);
      var r = !this.args[0].evaluate(e).booleanValue();
      return new BooleanValue(r);
    },
    true: function () {
      return assert(0 == this.args.length), new BooleanValue(!0);
    },
    false: function () {
      return assert(0 == this.args.length), new BooleanValue(!1);
    },
    lang: function (e) {
      assert(1 == this.args.length);
      for (
        var r, t = this.args[0].evaluate(e).stringValue(), a = e.node;
        a && a != a.parentNode && !(r = a.getAttribute("xml:lang"));

      )
        a = a.parentNode;
      if (r) {
        var n = new RegExp("^" + t + "$", "i");
        return new BooleanValue(r.match(n) || r.replace(/_.*$/, "").match(n));
      }
      return new BooleanValue(!1);
    },
    number: function (e) {
      return (
        assert(1 == this.args.length || 0 == this.args.length),
        1 == this.args.length
          ? new NumberValue(this.args[0].evaluate(e).numberValue())
          : new NumberValue(new NodeSetValue([e.node]).numberValue())
      );
    },
    sum: function (e) {
      assert(1 == this.args.length);
      for (
        var r = this.args[0].evaluate(e).nodeSetValue(), t = 0, a = 0;
        a < r.length;
        ++a
      )
        t += xmlValue(r[a]) - 0;
      return new NumberValue(t);
    },
    floor: function (e) {
      assert(1 == this.args.length);
      var r = this.args[0].evaluate(e).numberValue();
      return new NumberValue(Math.floor(r));
    },
    ceiling: function (e) {
      assert(1 == this.args.length);
      var r = this.args[0].evaluate(e).numberValue();
      return new NumberValue(Math.ceil(r));
    },
    round: function (e) {
      assert(1 == this.args.length);
      var r = this.args[0].evaluate(e).numberValue();
      return new NumberValue(Math.round(r));
    },
    "ext-join": function (e) {
      assert(2 == this.args.length);
      for (
        var r = this.args[0].evaluate(e).nodeSetValue(),
          t = this.args[1].evaluate(e).stringValue(),
          a = "",
          n = 0;
        n < r.length;
        ++n
      )
        a && (a += t), (a += xmlValue(r[n]));
      return new StringValue(a);
    },
    "ext-if": function (e) {
      return (
        assert(3 == this.args.length),
        this.args[0].evaluate(e).booleanValue()
          ? this.args[1].evaluate(e)
          : this.args[2].evaluate(e)
      );
    },
    "ext-cardinal": function (e) {
      assert(this.args.length >= 1);
      for (
        var r = this.args[0].evaluate(e).numberValue(), t = [], a = 0;
        a < r;
        ++a
      )
        t.push(e.node);
      return new NodeSetValue(t);
    },
  },
  FunctionCallExpr = function (e) {
    (this.name = e), (this.args = []);
  };
(FunctionCallExpr.prototype.appendArg = function (e) {
  this.args.push(e);
}),
  (FunctionCallExpr.prototype.evaluate = function (e) {
    var r = "" + this.name.value,
      t = xpathfunctions[r];
    return t ? t.call(this, e) : new BooleanValue(!1);
  });
var UnionExpr = function (e, r) {
  (this.expr1 = e), (this.expr2 = r);
};
UnionExpr.prototype.evaluate = function (e) {
  for (
    var r = this.expr1.evaluate(e).nodeSetValue(),
      t = this.expr2.evaluate(e).nodeSetValue(),
      a = r.length,
      n = 0,
      o = t;
    n < o.length;
    n += 1
  ) {
    for (var s = o[n], i = !1, l = 0; l < a; ++l)
      r[l] == s && ((i = !0), (l = a));
    i || r.push(s);
  }
  return new NodeSetValue(r);
};
var PathExpr = function (e, r) {
  (this.filter = e), (this.rel = r);
};
PathExpr.prototype.evaluate = function (e) {
  var r = this.filter.evaluate(e).nodeSetValue(),
    t = [];
  if (e.returnOnFirstMatch) {
    for (
      var a = 0;
      a < r.length &&
      !((t = this.rel.evaluate(e.clone(r[a], a, r)).nodeSetValue()).length > 0);
      ++a
    );
    return new NodeSetValue(t);
  }
  for (var n = 0; n < r.length; ++n)
    for (
      var o = this.rel.evaluate(e.clone(r[n], n, r)).nodeSetValue(), s = 0;
      s < o.length;
      ++s
    )
      t.push(o[s]);
  return new NodeSetValue(t);
};
var FilterExpr = function (e, r) {
  (this.expr = e), (this.predicate = r);
};
FilterExpr.prototype.evaluate = function (e) {
  var r = e.returnOnFirstMatch;
  e.setReturnOnFirstMatch(!1);
  var t = this.expr.evaluate(e).nodeSetValue();
  e.setReturnOnFirstMatch(r);
  for (var a = 0; a < this.predicate.length; ++a) {
    var n = t;
    t = [];
    for (var o = 0; o < n.length; ++o) {
      var s = n[o];
      this.predicate[a].evaluate(e.clone(s, o, n)).booleanValue() && t.push(s);
    }
  }
  return new NodeSetValue(t);
};
var UnaryMinusExpr = function (e) {
  this.expr = e;
};
UnaryMinusExpr.prototype.evaluate = function (e) {
  return new NumberValue(-this.expr.evaluate(e).numberValue());
};
var BinaryExpr = function (e, r, t) {
  (this.expr1 = e), (this.expr2 = t), (this.op = r);
};
(BinaryExpr.prototype.evaluate = function (e) {
  var r;
  switch (this.op.value) {
    case "or":
      r = new BooleanValue(
        this.expr1.evaluate(e).booleanValue() ||
          this.expr2.evaluate(e).booleanValue()
      );
      break;
    case "and":
      r = new BooleanValue(
        this.expr1.evaluate(e).booleanValue() &&
          this.expr2.evaluate(e).booleanValue()
      );
      break;
    case "+":
      r = new NumberValue(
        this.expr1.evaluate(e).numberValue() +
          this.expr2.evaluate(e).numberValue()
      );
      break;
    case "-":
      r = new NumberValue(
        this.expr1.evaluate(e).numberValue() -
          this.expr2.evaluate(e).numberValue()
      );
      break;
    case "*":
      r = new NumberValue(
        this.expr1.evaluate(e).numberValue() *
          this.expr2.evaluate(e).numberValue()
      );
      break;
    case "mod":
      r = new NumberValue(
        this.expr1.evaluate(e).numberValue() %
          this.expr2.evaluate(e).numberValue()
      );
      break;
    case "div":
      r = new NumberValue(
        this.expr1.evaluate(e).numberValue() /
          this.expr2.evaluate(e).numberValue()
      );
      break;
    case "=":
      r = this.compare(e, function (e, r) {
        return e == r;
      });
      break;
    case "!=":
      r = this.compare(e, function (e, r) {
        return e != r;
      });
      break;
    case "<":
      r = this.compare(e, function (e, r) {
        return e < r;
      });
      break;
    case "<=":
      r = this.compare(e, function (e, r) {
        return e <= r;
      });
      break;
    case ">":
      r = this.compare(e, function (e, r) {
        return e > r;
      });
      break;
    case ">=":
      r = this.compare(e, function (e, r) {
        return e >= r;
      });
      break;
    default:
      throw "BinaryExpr.evaluate: " + this.op.value;
  }
  return r;
}),
  (BinaryExpr.prototype.compare = function (e, r) {
    var t,
      a = this.expr1.evaluate(e),
      n = this.expr2.evaluate(e);
    if ("node-set" == a.type && "node-set" == n.type) {
      var o = a.nodeSetValue(),
        s = n.nodeSetValue();
      t = !1;
      for (var i = 0; i < o.length; ++i)
        for (var l = 0; l < s.length; ++l)
          r(xmlValue(o[i]), xmlValue(s[l])) &&
            ((t = !0), (l = s.length), (i = o.length));
    } else if ("node-set" == a.type || "node-set" == n.type)
      if ("number" == a.type) {
        var u = a.numberValue(),
          c = n.nodeSetValue();
        t = !1;
        for (var p = 0; p < c.length; ++p) {
          if (r(u, xmlValue(c[p]) - 0)) {
            t = !0;
            break;
          }
        }
      } else if ("number" == n.type) {
        var h = a.nodeSetValue(),
          d = n.numberValue();
        t = !1;
        for (var g = 0; g < h.length; ++g) {
          if (r(xmlValue(h[g]) - 0, d)) {
            t = !0;
            break;
          }
        }
      } else if ("string" == a.type) {
        var m = a.stringValue(),
          f = n.nodeSetValue();
        t = !1;
        for (var b = 0; b < f.length; ++b) {
          if (r(m, xmlValue(f[b]))) {
            t = !0;
            break;
          }
        }
      } else if ("string" == n.type) {
        var E = a.nodeSetValue(),
          x = n.stringValue();
        t = !1;
        for (var v = 0; v < E.length; ++v) {
          if (r(xmlValue(E[v]), x)) {
            t = !0;
            break;
          }
        }
      } else t = r(a.booleanValue(), n.booleanValue());
    else
      t =
        "boolean" == a.type || "boolean" == n.type
          ? r(a.booleanValue(), n.booleanValue())
          : "number" == a.type || "number" == n.type
          ? r(a.numberValue(), n.numberValue())
          : r(a.stringValue(), n.stringValue());
    return new BooleanValue(t);
  });
var LiteralExpr = function (e) {
  this.value = e;
};
LiteralExpr.prototype.evaluate = function () {
  return new StringValue(this.value);
};
var NumberExpr = function (e) {
  this.value = e;
};
NumberExpr.prototype.evaluate = function () {
  return new NumberValue(this.value);
};
var VariableExpr = function (e) {
  this.name = e;
};
function makeTokenExpr(e) {
  return new TokenExpr(e);
}
function passExpr(e) {
  return e;
}
function makeLocationExpr1(e, r) {
  return (r.absolute = !0), r;
}
function makeLocationExpr2(e, r) {
  return (r.absolute = !0), r.prependStep(makeAbbrevStep(e.value)), r;
}
function makeLocationExpr3() {
  var e = new LocationExpr();
  return e.appendStep(makeAbbrevStep(".")), (e.absolute = !0), e;
}
function makeLocationExpr4(e) {
  var r = new LocationExpr();
  return (r.absolute = !0), r.appendStep(makeAbbrevStep(e.value)), r;
}
function makeLocationExpr5(e) {
  var r = new LocationExpr();
  return r.appendStep(e), r;
}
function makeLocationExpr6(e, r, t) {
  return e.appendStep(t), e;
}
function makeLocationExpr7(e, r, t) {
  return e.appendStep(makeAbbrevStep(r.value)), e.appendStep(t), e;
}
function makeStepExpr1(e) {
  return makeAbbrevStep(e.value);
}
function makeStepExpr2(e) {
  return makeAbbrevStep(e.value);
}
function makeStepExpr3(e, r, t) {
  return new StepExpr(e.value, t);
}
function makeStepExpr4(e, r) {
  return new StepExpr("attribute", r);
}
function makeStepExpr5(e) {
  return new StepExpr("child", e);
}
function makeStepExpr6(e, r) {
  return e.appendPredicate(r), e;
}
function makeAbbrevStep(e) {
  switch (e) {
    case "//":
      return new StepExpr("descendant-or-self", new NodeTestAny());
    case ".":
      return new StepExpr("self", new NodeTestAny());
    case "..":
      return new StepExpr("parent", new NodeTestAny());
  }
}
function makeNodeTestExpr1() {
  return new NodeTestElementOrAttribute();
}
function makeNodeTestExpr2(e) {
  return new NodeTestNC(e.value);
}
function makeNodeTestExpr3(e) {
  return new NodeTestName(e.value);
}
function makeNodeTestExpr4(e) {
  switch (e.value.replace(/\s*\($/, "")) {
    case "node":
      return new NodeTestAny();
    case "text":
      return new NodeTestText();
    case "comment":
      return new NodeTestComment();
    case "processing-instruction":
      return new NodeTestPI("");
  }
}
function makeNodeTestExpr5(e, r) {
  var t = e.replace(/\s*\($/, "");
  if ("processing-instruction" != t) throw t;
  return new NodeTestPI(r.value);
}
function makePredicateExpr(e, r) {
  return new PredicateExpr(r);
}
function makePrimaryExpr(e, r) {
  return r;
}
function makeFunctionCallExpr1(e) {
  return new FunctionCallExpr(e);
}
function makeFunctionCallExpr2(e, r, t, a) {
  var n = new FunctionCallExpr(e);
  n.appendArg(t);
  for (var o = 0; o < a.length; ++o) n.appendArg(a[o]);
  return n;
}
function makeArgumentExpr(e, r) {
  return r;
}
function makeUnionExpr(e, r, t) {
  return new UnionExpr(e, t);
}
function makePathExpr1(e, r, t) {
  return new PathExpr(e, t);
}
function makePathExpr2(e, r, t) {
  return t.prependStep(makeAbbrevStep(r.value)), new PathExpr(e, t);
}
function makeFilterExpr(e, r) {
  return r.length > 0 ? new FilterExpr(e, r) : e;
}
function makeUnaryMinusExpr(e, r) {
  return new UnaryMinusExpr(r);
}
function makeBinaryExpr(e, r, t) {
  return new BinaryExpr(e, r, t);
}
function makeLiteralExpr(e) {
  var r = e.value.substring(1, e.value.length - 1);
  return new LiteralExpr(r);
}
function makeNumberExpr(e) {
  return new NumberExpr(e.value);
}
function makeVariableReference(e, r) {
  return new VariableExpr(r.value);
}
function makeSimpleExpr(e) {
  if ("$" == e.charAt(0)) return new VariableExpr(e.substr(1));
  if ("@" == e.charAt(0)) {
    var r = new NodeTestName(e.substr(1)),
      t = new StepExpr("attribute", r),
      a = new LocationExpr();
    return a.appendStep(t), a;
  }
  if (e.match(/^[0-9]+$/)) return new NumberExpr(e);
  var n = new NodeTestName(e),
    o = new StepExpr("child", n),
    s = new LocationExpr();
  return s.appendStep(o), s;
}
function makeSimpleExpr2(e) {
  for (var r = e.split("/"), t = new LocationExpr(), a = 0; a < r.length; ++a) {
    var n = new NodeTestName(r[a]),
      o = new StepExpr("child", n);
    t.appendStep(o);
  }
  return t;
}
VariableExpr.prototype.evaluate = function (e) {
  return e.getVariable(this.name);
};
var xpathAxis = {
    ANCESTOR_OR_SELF: "ancestor-or-self",
    ANCESTOR: "ancestor",
    ATTRIBUTE: "attribute",
    CHILD: "child",
    DESCENDANT_OR_SELF: "descendant-or-self",
    DESCENDANT: "descendant",
    FOLLOWING_SIBLING: "following-sibling",
    FOLLOWING: "following",
    NAMESPACE: "namespace",
    PARENT: "parent",
    PRECEDING_SIBLING: "preceding-sibling",
    PRECEDING: "preceding",
    SELF: "self",
  },
  xpathAxesRe = [
    xpathAxis.ANCESTOR_OR_SELF,
    xpathAxis.ANCESTOR,
    xpathAxis.ATTRIBUTE,
    xpathAxis.CHILD,
    xpathAxis.DESCENDANT_OR_SELF,
    xpathAxis.DESCENDANT,
    xpathAxis.FOLLOWING_SIBLING,
    xpathAxis.FOLLOWING,
    xpathAxis.NAMESPACE,
    xpathAxis.PARENT,
    xpathAxis.PRECEDING_SIBLING,
    xpathAxis.PRECEDING,
    xpathAxis.SELF,
  ].join("|"),
  TOK_PIPE = { label: "|", prec: 17, re: new RegExp("^\\|") },
  TOK_DSLASH = { label: "//", prec: 19, re: new RegExp("^//") },
  TOK_SLASH = { label: "/", prec: 30, re: new RegExp("^/") },
  TOK_AXIS = { label: "::", prec: 20, re: new RegExp("^::") },
  TOK_COLON = { label: ":", prec: 1e3, re: new RegExp("^:") },
  TOK_AXISNAME = { label: "[axis]", re: new RegExp("^(" + xpathAxesRe + ")") },
  TOK_PARENO = { label: "(", prec: 34, re: new RegExp("^\\(") },
  TOK_PARENC = { label: ")", re: new RegExp("^\\)") },
  TOK_DDOT = { label: "..", prec: 34, re: new RegExp("^\\.\\.") },
  TOK_DOT = { label: ".", prec: 34, re: new RegExp("^\\.") },
  TOK_AT = { label: "@", prec: 34, re: new RegExp("^@") },
  TOK_COMMA = { label: ",", re: new RegExp("^,") },
  TOK_OR = { label: "or", prec: 10, re: new RegExp("^or\\b") },
  TOK_AND = { label: "and", prec: 11, re: new RegExp("^and\\b") },
  TOK_EQ = { label: "=", prec: 12, re: new RegExp("^=") },
  TOK_NEQ = { label: "!=", prec: 12, re: new RegExp("^!=") },
  TOK_GE = { label: ">=", prec: 13, re: new RegExp("^>=") },
  TOK_GT = { label: ">", prec: 13, re: new RegExp("^>") },
  TOK_LE = { label: "<=", prec: 13, re: new RegExp("^<=") },
  TOK_LT = { label: "<", prec: 13, re: new RegExp("^<") },
  TOK_PLUS = { label: "+", prec: 14, re: new RegExp("^\\+"), left: !0 },
  TOK_MINUS = { label: "-", prec: 14, re: new RegExp("^\\-"), left: !0 },
  TOK_DIV = { label: "div", prec: 15, re: new RegExp("^div\\b"), left: !0 },
  TOK_MOD = { label: "mod", prec: 15, re: new RegExp("^mod\\b"), left: !0 },
  TOK_BRACKO = { label: "[", prec: 32, re: new RegExp("^\\[") },
  TOK_BRACKC = { label: "]", re: new RegExp("^\\]") },
  TOK_DOLLAR = { label: "$", re: new RegExp("^\\$") },
  TOK_NCNAME = { label: "[ncname]", re: new RegExp("^" + XML_NC_NAME) },
  TOK_ASTERISK = { label: "*", prec: 15, re: new RegExp("^\\*"), left: !0 },
  TOK_LITERALQ = { label: "[litq]", prec: 20, re: new RegExp("^'[^\\']*'") },
  TOK_LITERALQQ = { label: "[litqq]", prec: 20, re: new RegExp('^"[^\\"]*"') },
  TOK_NUMBER = {
    label: "[number]",
    prec: 35,
    re: new RegExp("^\\d+(\\.\\d*)?"),
  },
  TOK_QNAME = {
    label: "[qname]",
    re: new RegExp("^(" + XML_NC_NAME + ":)?" + XML_NC_NAME),
  },
  TOK_NODEO = {
    label: "[nodetest-start]",
    re: new RegExp("^(processing-instruction|comment|text|node)\\("),
  },
  xpathTokenRules = [
    TOK_DSLASH,
    TOK_SLASH,
    TOK_DDOT,
    TOK_DOT,
    TOK_AXIS,
    TOK_COLON,
    TOK_AXISNAME,
    TOK_NODEO,
    TOK_PARENO,
    TOK_PARENC,
    TOK_BRACKO,
    TOK_BRACKC,
    TOK_AT,
    TOK_COMMA,
    TOK_OR,
    TOK_AND,
    TOK_NEQ,
    TOK_EQ,
    TOK_GE,
    TOK_GT,
    TOK_LE,
    TOK_LT,
    TOK_PLUS,
    TOK_MINUS,
    TOK_ASTERISK,
    TOK_PIPE,
    TOK_MOD,
    TOK_DIV,
    TOK_LITERALQ,
    TOK_LITERALQQ,
    TOK_NUMBER,
    TOK_QNAME,
    TOK_NCNAME,
    TOK_DOLLAR,
  ],
  XPathLocationPath = { label: "LocationPath" },
  XPathRelativeLocationPath = { label: "RelativeLocationPath" },
  XPathAbsoluteLocationPath = { label: "AbsoluteLocationPath" },
  XPathStep = { label: "Step" },
  XPathNodeTest = { label: "NodeTest" },
  XPathPredicate = { label: "Predicate" },
  XPathLiteral = { label: "Literal" },
  XPathExpr = { label: "Expr" },
  XPathPrimaryExpr = { label: "PrimaryExpr" },
  XPathVariableReference = { label: "Variablereference" },
  XPathNumber = { label: "Number" },
  XPathFunctionCall = { label: "FunctionCall" },
  XPathArgumentRemainder = { label: "ArgumentRemainder" },
  XPathPathExpr = { label: "PathExpr" },
  XPathUnionExpr = { label: "UnionExpr" },
  XPathFilterExpr = { label: "FilterExpr" },
  XPathDigits = { label: "Digits" },
  xpathNonTerminals = [
    XPathLocationPath,
    XPathRelativeLocationPath,
    XPathAbsoluteLocationPath,
    XPathStep,
    XPathNodeTest,
    XPathPredicate,
    XPathLiteral,
    XPathExpr,
    XPathPrimaryExpr,
    XPathVariableReference,
    XPathNumber,
    XPathFunctionCall,
    XPathArgumentRemainder,
    XPathPathExpr,
    XPathUnionExpr,
    XPathFilterExpr,
    XPathDigits,
  ],
  Q_01 = { label: "?" },
  Q_MM = { label: "*" },
  Q_1M = { label: "+" },
  ASSOC_LEFT = !0,
  xpathGrammarRules = [
    [XPathLocationPath, [XPathRelativeLocationPath], 18, passExpr],
    [XPathLocationPath, [XPathAbsoluteLocationPath], 18, passExpr],
    [
      XPathAbsoluteLocationPath,
      [TOK_SLASH, XPathRelativeLocationPath],
      18,
      makeLocationExpr1,
    ],
    [
      XPathAbsoluteLocationPath,
      [TOK_DSLASH, XPathRelativeLocationPath],
      18,
      makeLocationExpr2,
    ],
    [XPathAbsoluteLocationPath, [TOK_SLASH], 0, makeLocationExpr3],
    [XPathAbsoluteLocationPath, [TOK_DSLASH], 0, makeLocationExpr4],
    [XPathRelativeLocationPath, [XPathStep], 31, makeLocationExpr5],
    [
      XPathRelativeLocationPath,
      [XPathRelativeLocationPath, TOK_SLASH, XPathStep],
      31,
      makeLocationExpr6,
    ],
    [
      XPathRelativeLocationPath,
      [XPathRelativeLocationPath, TOK_DSLASH, XPathStep],
      31,
      makeLocationExpr7,
    ],
    [XPathStep, [TOK_DOT], 33, makeStepExpr1],
    [XPathStep, [TOK_DDOT], 33, makeStepExpr2],
    [XPathStep, [TOK_AXISNAME, TOK_AXIS, XPathNodeTest], 33, makeStepExpr3],
    [XPathStep, [TOK_AT, XPathNodeTest], 33, makeStepExpr4],
    [XPathStep, [XPathNodeTest], 33, makeStepExpr5],
    [XPathStep, [XPathStep, XPathPredicate], 33, makeStepExpr6],
    [XPathNodeTest, [TOK_ASTERISK], 33, makeNodeTestExpr1],
    [
      XPathNodeTest,
      [TOK_NCNAME, TOK_COLON, TOK_ASTERISK],
      33,
      makeNodeTestExpr2,
    ],
    [XPathNodeTest, [TOK_QNAME], 33, makeNodeTestExpr3],
    [XPathNodeTest, [TOK_NODEO, TOK_PARENC], 33, makeNodeTestExpr4],
    [
      XPathNodeTest,
      [TOK_NODEO, XPathLiteral, TOK_PARENC],
      33,
      makeNodeTestExpr5,
    ],
    [
      XPathPredicate,
      [TOK_BRACKO, XPathExpr, TOK_BRACKC],
      33,
      makePredicateExpr,
    ],
    [XPathPrimaryExpr, [XPathVariableReference], 33, passExpr],
    [
      XPathPrimaryExpr,
      [TOK_PARENO, XPathExpr, TOK_PARENC],
      33,
      makePrimaryExpr,
    ],
    [XPathPrimaryExpr, [XPathLiteral], 30, passExpr],
    [XPathPrimaryExpr, [XPathNumber], 30, passExpr],
    [XPathPrimaryExpr, [XPathFunctionCall], 31, passExpr],
    [
      XPathFunctionCall,
      [TOK_QNAME, TOK_PARENO, TOK_PARENC],
      -1,
      makeFunctionCallExpr1,
    ],
    [
      XPathFunctionCall,
      [
        TOK_QNAME,
        TOK_PARENO,
        XPathExpr,
        XPathArgumentRemainder,
        Q_MM,
        TOK_PARENC,
      ],
      -1,
      makeFunctionCallExpr2,
    ],
    [XPathArgumentRemainder, [TOK_COMMA, XPathExpr], -1, makeArgumentExpr],
    [XPathUnionExpr, [XPathPathExpr], 20, passExpr],
    [
      XPathUnionExpr,
      [XPathUnionExpr, TOK_PIPE, XPathPathExpr],
      20,
      makeUnionExpr,
    ],
    [XPathPathExpr, [XPathLocationPath], 20, passExpr],
    [XPathPathExpr, [XPathFilterExpr], 19, passExpr],
    [
      XPathPathExpr,
      [XPathFilterExpr, TOK_SLASH, XPathRelativeLocationPath],
      19,
      makePathExpr1,
    ],
    [
      XPathPathExpr,
      [XPathFilterExpr, TOK_DSLASH, XPathRelativeLocationPath],
      19,
      makePathExpr2,
    ],
    [
      XPathFilterExpr,
      [XPathPrimaryExpr, XPathPredicate, Q_MM],
      31,
      makeFilterExpr,
    ],
    [XPathExpr, [XPathPrimaryExpr], 16, passExpr],
    [XPathExpr, [XPathUnionExpr], 16, passExpr],
    [XPathExpr, [TOK_MINUS, XPathExpr], -1, makeUnaryMinusExpr],
    [XPathExpr, [XPathExpr, TOK_OR, XPathExpr], -1, makeBinaryExpr],
    [XPathExpr, [XPathExpr, TOK_AND, XPathExpr], -1, makeBinaryExpr],
    [XPathExpr, [XPathExpr, TOK_EQ, XPathExpr], -1, makeBinaryExpr],
    [XPathExpr, [XPathExpr, TOK_NEQ, XPathExpr], -1, makeBinaryExpr],
    [XPathExpr, [XPathExpr, TOK_LT, XPathExpr], -1, makeBinaryExpr],
    [XPathExpr, [XPathExpr, TOK_LE, XPathExpr], -1, makeBinaryExpr],
    [XPathExpr, [XPathExpr, TOK_GT, XPathExpr], -1, makeBinaryExpr],
    [XPathExpr, [XPathExpr, TOK_GE, XPathExpr], -1, makeBinaryExpr],
    [
      XPathExpr,
      [XPathExpr, TOK_PLUS, XPathExpr],
      -1,
      makeBinaryExpr,
      ASSOC_LEFT,
    ],
    [
      XPathExpr,
      [XPathExpr, TOK_MINUS, XPathExpr],
      -1,
      makeBinaryExpr,
      ASSOC_LEFT,
    ],
    [
      XPathExpr,
      [XPathExpr, TOK_ASTERISK, XPathExpr],
      -1,
      makeBinaryExpr,
      ASSOC_LEFT,
    ],
    [
      XPathExpr,
      [XPathExpr, TOK_DIV, XPathExpr],
      -1,
      makeBinaryExpr,
      ASSOC_LEFT,
    ],
    [
      XPathExpr,
      [XPathExpr, TOK_MOD, XPathExpr],
      -1,
      makeBinaryExpr,
      ASSOC_LEFT,
    ],
    [XPathLiteral, [TOK_LITERALQ], -1, makeLiteralExpr],
    [XPathLiteral, [TOK_LITERALQQ], -1, makeLiteralExpr],
    [XPathNumber, [TOK_NUMBER], -1, makeNumberExpr],
    [
      XPathVariableReference,
      [TOK_DOLLAR, TOK_QNAME],
      200,
      makeVariableReference,
    ],
  ],
  xpathRules = [];
function xpathParseInit(e) {
  if (!xpathRules.length) {
    xpathGrammarRules.sort(function (e, r) {
      var t = e[1].length,
        a = r[1].length;
      return t < a ? 1 : t > a ? -1 : 0;
    });
    for (var r = 1, t = 0; t < xpathNonTerminals.length; ++t)
      xpathNonTerminals[t].key = r++;
    for (var a = 0; a < xpathTokenRules.length; ++a)
      xpathTokenRules[a].key = r++;
    e("XPath parse INIT: " + r + " rules");
    for (var n = 0; n < xpathGrammarRules.length; ++n)
      for (
        var o = xpathGrammarRules[n], s = o[1], i = s.length - 1;
        i >= 0;
        --i
      ) {
        if (s[i] == Q_1M) {
          u(xpathRules, s[i - 1].key, o);
          break;
        }
        if (s[i] != Q_MM && s[i] != Q_01) {
          u(xpathRules, s[i].key, o);
          break;
        }
        u(xpathRules, s[i - 1].key, o), --i;
      }
    e("XPath parse INIT: " + xpathRules.length + " rule bins");
    var l = 0;
    mapExec(xpathRules, function (e) {
      e && (l += e.length);
    }),
      e("XPath parse INIT: " + l / xpathRules.length + " average bin size");
  }
  function u(e, r, t) {
    e[r] || (e[r] = []), e[r].push(t);
  }
}
function xpathCollectDescendants(e, r, t) {
  if (t && r.getElementsByTagName) copyArray(e, r.getElementsByTagName(t));
  else
    for (var a = r.firstChild; a; a = a.nextSibling)
      e.push(a), xpathCollectDescendants(e, a);
}
function xpathExtractTagNameFromNodeTest(e, r) {
  return e instanceof NodeTestName
    ? e.name
    : (r && e instanceof NodeTestAny) || e instanceof NodeTestElementOrAttribute
    ? "*"
    : void 0;
}
function xpathCollectDescendantsReverse(e, r) {
  for (var t = r.lastChild; t; t = t.previousSibling)
    e.push(t), xpathCollectDescendantsReverse(e, t);
}
function xpathSort(e, r) {
  if (0 != r.length) {
    for (var t = [], a = 0; a < e.contextSize(); ++a) {
      for (
        var n = e.nodelist[a],
          o = { node: n, key: [] },
          s = e.clone(n, 0, [n]),
          i = 0,
          l = r;
        i < l.length;
        i += 1
      ) {
        var u = l[i],
          c = u.expr.evaluate(s),
          p = void 0;
        "text" == u.type
          ? (p = c.stringValue())
          : "number" == u.type && (p = c.numberValue()),
          o.key.push({ value: p, order: u.order });
      }
      o.key.push({ value: a, order: "ascending" }), t.push(o);
    }
    t.sort(xpathSortByKey);
    for (var h = [], d = 0; d < t.length; ++d) h.push(t[d].node);
    (e.nodelist = h), e.setNode(0);
  }
}
function xpathSortByKey(e, r) {
  for (var t = 0; t < e.key.length; ++t) {
    var a = "descending" == e.key[t].order ? -1 : 1;
    if (e.key[t].value > r.key[t].value) return 1 * a;
    if (e.key[t].value < r.key[t].value) return -1 * a;
  }
  return 0;
}
function xpathEval(e, r) {
  return xpathParse(e).evaluate(r);
}
function assert(e) {
  if (!e) throw "Assertion failed";
}
function mapExec(e, r) {
  for (var t = 0; t < e.length; ++t) r.call(this, e[t], t);
}
function mapExpr(e, r) {
  for (var t = [], a = 0; a < e.length; ++a) t.push(r(e[a]));
  return t;
}
function reverseInplace(e) {
  for (var r = 0; r < e.length / 2; ++r) {
    var t = e[r],
      a = e.length - r - 1;
    (e[r] = e[a]), (e[a] = t);
  }
}
function copyArray(e, r) {
  if (r) for (var t = e.length, a = r.length - 1; a >= 0; --a) e[a + t] = r[a];
}
function copyArrayIgnoringAttributesWithoutValue(e, r) {
  if (r) for (var t = r.length - 1; t >= 0; --t) r[t].nodeValue && e.push(r[t]);
}
function xmlValue(e, r) {
  if (!e) return "";
  var t = "";
  if (e.nodeType == DOM_TEXT_NODE || e.nodeType == DOM_CDATA_SECTION_NODE)
    t += e.nodeValue;
  else if (e.nodeType == DOM_ATTRIBUTE_NODE) t += e.nodeValue;
  else if (
    e.nodeType == DOM_ELEMENT_NODE ||
    e.nodeType == DOM_DOCUMENT_NODE ||
    e.nodeType == DOM_DOCUMENT_FRAGMENT_NODE
  ) {
    if (!r) {
      var a = e.innerText;
      if (null != a) return a;
      var n = e.textContent;
      if (null != n) return n;
    }
    for (var o = e.childNodes.length, s = 0; s < o; ++s)
      t += xmlValue(e.childNodes[s]);
  }
  return t;
}
function xmlText(e, r) {
  var t = [];
  return xmlTextR(e, t, r), t.join("");
}
function xmlTextR(e, r, t) {
  if (e.nodeType == DOM_TEXT_NODE) r.push(xmlEscapeText(e.nodeValue));
  else if (e.nodeType == DOM_CDATA_SECTION_NODE)
    t ? r.push(e.nodeValue) : r.push("<![CDATA[" + e.nodeValue + "]]>");
  else if (e.nodeType == DOM_COMMENT_NODE)
    r.push("\x3c!--" + e.nodeValue + "--\x3e");
  else if (e.nodeType == DOM_ELEMENT_NODE) {
    r.push("<" + xmlFullNodeName(e));
    for (var a = 0; a < e.attributes.length; ++a) {
      var n = e.attributes[a];
      n &&
        n.nodeName &&
        n.nodeValue &&
        r.push(
          " " + xmlFullNodeName(n) + '="' + xmlEscapeAttr(n.nodeValue) + '"'
        );
    }
    if (0 == e.childNodes.length) r.push("/>");
    else {
      r.push(">");
      for (var o = 0; o < e.childNodes.length; ++o)
        xmlTextR(e.childNodes[o], r, t);
      r.push("</" + xmlFullNodeName(e) + ">");
    }
  } else if (
    e.nodeType == DOM_DOCUMENT_NODE ||
    e.nodeType == DOM_DOCUMENT_FRAGMENT_NODE
  )
    for (var s = 0; s < e.childNodes.length; ++s)
      xmlTextR(e.childNodes[s], r, t);
}
function xmlFullNodeName(e) {
  return e.prefix && 0 != e.nodeName.indexOf(e.prefix + ":")
    ? e.prefix + ":" + e.nodeName
    : e.nodeName;
}
function xmlEscapeText(e) {
  return ("" + e)
    .replace(/&/g, "&amp;")
    .replace(/&amp;amp;/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;");
}
function xmlEscapeAttr(e) {
  return xmlEscapeText(e).replace(/"/g, "&quot;");
}
function xmlOwnerDocument(e) {
  return e.nodeType == DOM_DOCUMENT_NODE ? e : e.ownerDocument;
}
function domGetAttribute(e, r) {
  return e.getAttribute(r);
}
function domSetAttribute(e, r, t) {
  return e.setAttribute(r, t);
}
function domAppendChild(e, r) {
  return e.appendChild(r);
}
function domCreateTextNode(e, r) {
  return e.createTextNode(r);
}
function domCreateElement(e, r) {
  return e.createElement(r);
}
function domCreateCDATASection(e, r) {
  return e.createCDATASection(r);
}
function domCreateComment(e, r) {
  return e.createComment(r);
}
function domCreateDocumentFragment(e) {
  return e.createDocumentFragment();
}
var regExpSpecials = [
    "/",
    ".",
    "*",
    "+",
    "?",
    "|",
    "^",
    "$",
    "(",
    ")",
    "[",
    "]",
    "{",
    "}",
    "\\",
  ],
  sRE = new RegExp("(\\" + regExpSpecials.join("|\\") + ")", "g");
function regExpEscape(e) {
  return e.replace(sRE, "\\$1");
}
function predicateExprHasPositionalSelector(e, r) {
  if (!e) return !1;
  if (!r && exprReturnsNumberValue(e)) return !0;
  if (e instanceof FunctionCallExpr) {
    var t = e.name.value;
    return "last" == t || "position" == t;
  }
  return (
    e instanceof BinaryExpr &&
    (predicateExprHasPositionalSelector(e.expr1, !0) ||
      predicateExprHasPositionalSelector(e.expr2, !0))
  );
}
function exprReturnsNumberValue(e) {
  if (e instanceof FunctionCallExpr) {
    return {
      last: !0,
      position: !0,
      count: !0,
      "string-length": !0,
      number: !0,
      sum: !0,
      floor: !0,
      ceiling: !0,
      round: !0,
    }[e.name.value];
  }
  if (e instanceof UnaryMinusExpr) return !0;
  if (e instanceof BinaryExpr) {
    return { "+": !0, "-": !0, "*": !0, mod: !0, div: !0 }[e.op.value];
  }
  return e instanceof NumberExpr;
}
export function xsltProcess(e, r, t) {
  var a = domCreateDocumentFragment(new XDocument()),
    n = new ExprContext(e);
  if (t && "object" == typeof t)
    for (var o = 0, s = Object.entries(t); o < s.length; o += 1) {
      var i = s[o],
        l = i[0],
        u = i[1];
      n.setVariable(l, new StringValue(u));
    }
  return n.setVariable(), xsltProcessContext(n, r, a, t), xmlText(a);
}
function xsltProcessContext(e, r, t, a) {
  var n,
    o,
    s,
    i,
    l,
    u,
    c,
    p,
    h,
    d,
    g,
    m,
    f = xmlOwnerDocument(t),
    b = r.nodeName.split(/:/);
  if (1 == b.length || "xsl" != b[0]) xsltPassThrough(e, r, t, f);
  else
    switch (b[1]) {
      case "apply-imports":
        throw "not implemented: " + b[1];
      case "apply-templates":
        (u = (i = xmlGetAttribute(r, "select"))
          ? xpathEval(i, e).nodeSetValue()
          : e.node.childNodes),
          xsltWithParam((c = e.clone(u[0], 0, u)), r),
          xsltSort(c, r),
          (p = xmlGetAttribute(r, "mode")),
          (o = r.ownerDocument.documentElement),
          (h = []);
        for (var E = 0; E < o.childNodes.length; ++E) {
          var x = o.childNodes[E];
          x.nodeType != DOM_ELEMENT_NODE ||
            "xsl:template" != x.nodeName ||
            (p && x.getAttribute("mode") != p) ||
            h.push(x);
        }
        for (var v = 0; v < c.contextSize(); ++v)
          for (var A = c.nodelist[v], N = 0; N < h.length; ++N)
            xsltProcessContext(c.clone(A, v), h[N], t);
        break;
      case "attribute":
        (n = xsltAttributeValue(xmlGetAttribute(r, "name"), e)),
          xsltChildNodes(e, r, (s = domCreateDocumentFragment(f))),
          domSetAttribute(t, n, (l = xmlValue(s)));
        break;
      case "attribute-set":
        throw "not implemented: " + b[1];
      case "call-template":
        (n = xmlGetAttribute(r, "name")),
          (o = r.ownerDocument.documentElement),
          xsltWithParam((d = e.clone()), r);
        for (var T = 0; T < o.childNodes.length; ++T) {
          var y = o.childNodes[T];
          if (
            y.nodeType == DOM_ELEMENT_NODE &&
            "xsl:template" == y.nodeName &&
            domGetAttribute(y, "name") == n
          ) {
            xsltChildNodes(d, y, t);
            break;
          }
        }
        break;
      case "choose":
        xsltChoose(e, r, t);
        break;
      case "comment":
        xsltChildNodes(e, r, (s = domCreateDocumentFragment(f))),
          (g = domCreateComment(f, xmlValue(s))),
          t.appendChild(g);
        break;
      case "copy":
        (s = xsltCopy(t, e.node, f)) && xsltChildNodes(e, r, s);
        break;
      case "copy-of":
        if (
          "node-set" ==
          (l = xpathEval((i = xmlGetAttribute(r, "select")), e)).type
        ) {
          u = l.nodeSetValue();
          for (var w = 0; w < u.length; ++w) xsltCopyOf(t, u[w], f);
        } else {
          domAppendChild(t, domCreateTextNode(f, l.stringValue()));
        }
        break;
      case "decimal-format":
        throw "not implemented: " + b[1];
      case "element":
        domAppendChild(
          t,
          (s = domCreateElement(
            f,
            (n = xsltAttributeValue(xmlGetAttribute(r, "name"), e))
          ))
        ),
          xsltChildNodes(e, r, s);
        break;
      case "fallback":
        throw "not implemented: " + b[1];
      case "for-each":
        xsltForEach(e, r, t);
        break;
      case "if":
        xpathEval(xmlGetAttribute(r, "test"), e).booleanValue() &&
          xsltChildNodes(e, r, t);
        break;
      case "import":
      case "include":
      case "key":
      case "message":
      case "namespace-alias":
      case "number":
        throw "not implemented: " + b[1];
      case "otherwise":
        throw "error if here: " + b[1];
      case "output":
        break;
      case "preserve-space":
      case "processing-instruction":
        throw "not implemented: " + b[1];
      case "sort":
        break;
      case "strip-space":
        throw "not implemented: " + b[1];
      case "stylesheet":
      case "transform":
        xsltChildNodes(e, r, t);
        break;
      case "template":
        (m = xmlGetAttribute(r, "match")) &&
          xsltMatch(m, e) &&
          xsltChildNodes(e, r, t);
        break;
      case "text":
        (s = domCreateTextNode(f, xmlValue(r))), t.appendChild(s);
        break;
      case "value-of":
        (s = domCreateTextNode(
          f,
          (l = xpathEval((i = xmlGetAttribute(r, "select")), e).stringValue())
        )),
          t.appendChild(s);
        break;
      case "param":
        xsltVariable(e, r, !1);
        break;
      case "variable":
        xsltVariable(e, r, !0);
        break;
      case "when":
      case "with-param":
      default:
        throw "error if here: " + b[1];
    }
}
function xsltWithParam(e, r) {
  for (var t = 0, a = r.childNodes; t < a.length; t += 1) {
    var n = a[t];
    n.nodeType == DOM_ELEMENT_NODE &&
      "xsl:with-param" == n.nodeName &&
      xsltVariable(e, n, !0);
  }
}
function xsltSort(e, r) {
  for (var t = [], a = 0, n = r.childNodes; a < n.length; a += 1) {
    var o = n[a];
    if (o.nodeType == DOM_ELEMENT_NODE && "xsl:sort" == o.nodeName) {
      var s = xpathParse(xmlGetAttribute(o, "select")),
        i = xmlGetAttribute(o, "data-type") || "text",
        l = xmlGetAttribute(o, "order") || "ascending";
      t.push({ expr: s, type: i, order: l });
    }
  }
  xpathSort(e, t);
}
function xsltVariable(e, r, t) {
  var a,
    n = xmlGetAttribute(r, "name"),
    o = xmlGetAttribute(r, "select");
  if (r.childNodes.length > 0) {
    var s = domCreateDocumentFragment(r.ownerDocument);
    xsltChildNodes(e, r, s), (a = new NodeSetValue([s]));
  } else a = o ? xpathEval(o, e) : new StringValue("");
  (!t && e.getVariable(n)) || e.setVariable(n, a);
}
function xsltChoose(e, r, t) {
  for (var a = 0, n = r.childNodes; a < n.length; a += 1) {
    var o = n[a];
    if (o.nodeType == DOM_ELEMENT_NODE)
      if ("xsl:when" == o.nodeName) {
        if (xpathEval(xmlGetAttribute(o, "test"), e).booleanValue()) {
          xsltChildNodes(e, o, t);
          break;
        }
      } else if ("xsl:otherwise" == o.nodeName) {
        xsltChildNodes(e, o, t);
        break;
      }
  }
}
function xsltForEach(e, r, t) {
  var a = xpathEval(xmlGetAttribute(r, "select"), e).nodeSetValue(),
    n = e.clone(a[0], 0, a);
  xsltSort(n, r);
  for (var o = 0; o < n.contextSize(); ++o) {
    var s = n.nodelist[o];
    xsltChildNodes(n.clone(s, o), r, t);
  }
}
function xsltChildNodes(e, r, t) {
  for (var a = e.clone(), n = 0; n < r.childNodes.length; ++n)
    xsltProcessContext(a, r.childNodes[n], t);
}
function xsltPassThrough(e, r, t, a) {
  if (r.nodeType == DOM_TEXT_NODE)
    xsltPassText(r) && domAppendChild(t, domCreateTextNode(a, r.nodeValue));
  else if (r.nodeType == DOM_ELEMENT_NODE) {
    for (
      var n = domCreateElement(a, r.nodeName), o = 0, s = r.attributes;
      o < s.length;
      o += 1
    ) {
      var i = s[o];
      if (i) domSetAttribute(n, i.nodeName, xsltAttributeValue(i.nodeValue, e));
    }
    domAppendChild(t, n), xsltChildNodes(e, r, n);
  } else xsltChildNodes(e, r, t);
}
function xsltPassText(e) {
  if (!e.nodeValue.match(/^\s*$/)) return !0;
  var r = e.parentNode;
  if ("xsl:text" == r.nodeName) return !0;
  for (; r && r.nodeType == DOM_ELEMENT_NODE; ) {
    var t = domGetAttribute(r, "xml:space");
    if (t) {
      if ("default" == t) return !1;
      if ("preserve" == t) return !0;
    }
    r = r.parentNode;
  }
  return !1;
}
function xsltAttributeValue(e, r) {
  var t = e.split("{");
  if (1 == t.length) return e;
  for (var a = "", n = 0; n < t.length; ++n) {
    var o = t[n].split("}");
    if (2 == o.length) a += xpathEval(o[0], r).stringValue() + o[1];
    else a += t[n];
  }
  return a;
}
function xmlGetAttribute(e, r) {
  var t = domGetAttribute(e, r);
  return t ? he.decode(t) : t;
}
function xsltCopyOf(e, r, t) {
  if (
    r.nodeType == DOM_DOCUMENT_FRAGMENT_NODE ||
    r.nodeType == DOM_DOCUMENT_NODE
  )
    for (var a = 0; a < r.childNodes.length; ++a)
      xsltCopyOf(e, r.childNodes[a], t);
  else {
    var n = xsltCopy(e, r, t);
    if (n) {
      for (var o = 0; o < r.attributes.length; ++o)
        xsltCopyOf(n, r.attributes[o], t);
      for (var s = 0; s < r.childNodes.length; ++s)
        xsltCopyOf(n, r.childNodes[s], t);
    }
  }
}
function xsltCopy(e, r, t) {
  if (r.nodeType == DOM_ELEMENT_NODE) {
    var a = domCreateElement(t, r.nodeName);
    return domAppendChild(e, a), a;
  }
  if (r.nodeType == DOM_TEXT_NODE)
    domAppendChild(e, domCreateTextNode(t, r.nodeValue));
  else if (r.nodeType == DOM_CDATA_SECTION_NODE) {
    domAppendChild(e, domCreateCDATASection(t, r.nodeValue));
  } else if (r.nodeType == DOM_COMMENT_NODE) {
    domAppendChild(e, domCreateComment(t, r.nodeValue));
  } else
    r.nodeType == DOM_ATTRIBUTE_NODE &&
      domSetAttribute(e, r.nodeName, r.nodeValue);
  return null;
}
function xsltMatch(e, r) {
  var t,
    a = xpathParse(e);
  if (
    a.steps &&
    !a.absolute &&
    1 == a.steps.length &&
    "child" == a.steps[0].axis &&
    0 == a.steps[0].predicate.length
  )
    t = a.steps[0].nodetest.evaluate(r).booleanValue();
  else {
    t = !1;
    for (var n = r.node; !t && n; ) {
      for (
        var o = a.evaluate(r.clone(n, 0, [n])).nodeSetValue(), s = 0;
        s < o.length;
        ++s
      )
        if (o[s] == r.node) {
          t = !0;
          break;
        }
      n = n.parentNode;
    }
  }
  return t;
}
// (exports.xsltProcess = xsltProcess),
//   (exports.xmlParse = xmlParse),
//   (exports.xpathParse = xpathParse),
//   (exports.ExprContext = ExprContext);
